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