Mybatis?selectKey 如何返回新增用戶的id值
Mybatis selectKey返回新增用戶的id值
一、需求:新增用戶后,同時還要返回當(dāng)前新增用戶的id值
id是由數(shù)據(jù)庫的自動增長來實現(xiàn)的,所以就相當(dāng)于我們要在新增后將自動增長auto_increment的值返回。
?<insert id="saveUser" parameterType="USER"> ??? ?<!-- 配置保存時獲取插入的id -->? ??? ?<selectKey keyColumn="id" keyProperty="id" resultType="int">? ??? ??? ?select last_insert_id() as id;? ??? ?</selectKey> ??? ?insert into user(username,birthday,sex,address)? ??? ?values(#{username},#{birthday},#{sex},#{address})? ?</insert>
通過LAST_INSERT_ID()獲得剛插入的自動增長的id的值
或者
SELECT @@IDENTITY AS id
?<insert id="saveUser" parameterType="USER"> ?? ?insert into user(username,birthday,sex,address)? ??? ?values(#{username},#{birthday},#{sex},#{address}) ?? ?<selectKey resultClass="long" keyProperty="id"> ?? ??? ?SELECT @@IDENTITY AS id ?? ?</selectKey> </insert>
這時也能返回新增那一條數(shù)據(jù)的id,這時的selectkey沒有要求寫在前面以@@定義的變量都是系統(tǒng)的全局變量。
二、為什么要使用selectKey?
數(shù)據(jù)庫主鍵包括自增和非自增,有時候新增一條數(shù)據(jù)不僅僅知道成功就行了,后邊的邏輯可能還需要這個新增的主鍵,這時候再查詢數(shù)據(jù)庫就有點耗時耗力,我們可以采用selectKey來幫助我們獲取新增的主鍵。
三、屬性解析
keyProperty
結(jié)果集映射目標(biāo)類的屬性;
若存在多個,則使用逗號分隔;
keyColumn
目標(biāo)類的屬性,映射結(jié)果集的列名;
若存在多個,則使用逗號分割;
resultType
設(shè)置返回類型;
可使用全類名或者是別名;
order
設(shè)置此selectKey的執(zhí)行順序是早于sql語句,還是晚于sql語句;
候選值是BEFORE和AFTER;
statementType
設(shè)置sql語句的映射類型;候選值有:
STATEMENT,PREPARED,CALLABLE;
databaseID
與ibatis全局配置中的databaseIdProvider標(biāo)簽呼應(yīng)
Mybatis selectKey 采坑筆記
一、現(xiàn)象描述
觀察某張表的數(shù)據(jù)時,發(fā)現(xiàn)設(shè)置了自增屬性的AutoId,在插入數(shù)據(jù)后并不是自增的,而是數(shù)值跳躍著增加的。
二、問題排查
在確認AutoId的自增屬性設(shè)置沒有問題后,開始懷疑是不是insert語句的問題,insert語句是MyBatis Generator自動生成的,示例如下:
<insert id="insert" parameterType="com.xx.yy.datasource.domain.User" > ? <selectKey resultType="java.lang.Long" keyProperty="autoId" order="BEFORE" > ? SELECT LAST_INSERT_ID() </selectKey> ? insert into User (AutoId, UserId, Mobile, Username, CreateTime, LastModifyTime) ? values (#{autoId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{mobile,jdbcType=VARCHAR},? ? ?#{username,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{lastModifyTime,jdbcType=TIMESTAMP} ? ?) ?</insert>
insert into 語句在語法上是沒有問題的,那縮小排查范圍,就是selectKey的用法可能有問題!
三、selectKey 用法再認識
resultType
:表示的是返回主鍵的類型keyProperty
:對應(yīng)的domain 對象中需要被賦值的屬性,一般是主鍵order
:如果設(shè)置為 BEFORE,那么它會首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素
四、selectKey用法的坑
SelectKey需要注意order屬性,像MySQL一類支持自動增長類型的數(shù)據(jù)庫中,order需要設(shè)置為after才會取到正確的值,像Oracle這樣取序列的情況,需要設(shè)置為before。
在上面示例的insert用法中,就是order屬性設(shè)置成了BEFORE才導(dǎo)致自增屬性沒有生效。改成AFTER后,主鍵就開始自增了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 啟動時初始化數(shù)據(jù)庫的步驟
這篇文章主要介紹了springboot 啟動時初始化數(shù)據(jù)庫的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2021-01-01Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解
圖的領(lǐng)接矩陣存儲方式是用兩個數(shù)組來表示圖。一個一位數(shù)組存儲圖中頂點信息,一個二維數(shù)組存儲圖中的邊或弧的信息。本文將為大家重點介紹一下數(shù)據(jù)結(jié)構(gòu)中的圖的鄰接矩陣,快來跟隨小編一起學(xué)習(xí)吧2021-11-11Java中JMM與volatile關(guān)鍵字的學(xué)習(xí)
這篇文章主要介紹了通過實例解析JMM和Volatile關(guān)鍵字的學(xué)習(xí),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-09-09JAVA復(fù)制數(shù)組和重置數(shù)組大小操作
這篇文章主要介紹了JAVA復(fù)制數(shù)組和重置數(shù)組大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09