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沒有要求寫在前面以@@定義的變量都是系統(tǒng)的全局變量。
二、為什么要使用selectKey?
數(shù)據(jù)庫(kù)主鍵包括自增和非自增,有時(shí)候新增一條數(shù)據(jù)不僅僅知道成功就行了,后邊的邏輯可能還需要這個(gè)新增的主鍵,這時(shí)候再查詢數(shù)據(jù)庫(kù)就有點(diǎn)耗時(shí)耗力,我們可以采用selectKey來(lái)幫助我們獲取新增的主鍵。
三、屬性解析
keyProperty
結(jié)果集映射目標(biāo)類的屬性;
若存在多個(gè),則使用逗號(hào)分隔;
keyColumn
目標(biāo)類的屬性,映射結(jié)果集的列名;
若存在多個(gè),則使用逗號(hào)分割;
resultType
設(shè)置返回類型;
可使用全類名或者是別名;
order
設(shè)置此selectKey的執(zhí)行順序是早于sql語(yǔ)句,還是晚于sql語(yǔ)句;
候選值是BEFORE和AFTER;
statementType
設(shè)置sql語(yǔ)句的映射類型;候選值有:
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è)置沒有問(wèn)題后,開始懷疑是不是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ǔ)法上是沒有問(wèn)題的,那縮小排查范圍,就是selectKey的用法可能有問(wèn)題!
三、selectKey 用法再認(rèn)識(shí)
resultType:表示的是返回主鍵的類型keyProperty:對(duì)應(yīng)的domain 對(duì)象中需要被賦值的屬性,一般是主鍵order:如果設(shè)置為 BEFORE,那么它會(huì)首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語(yǔ)句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語(yǔ)句,然后是 selectKey 元素
四、selectKey用法的坑
SelectKey需要注意order屬性,像MySQL一類支持自動(dòng)增長(zhǎng)類型的數(shù)據(jù)庫(kù)中,order需要設(shè)置為after才會(huì)取到正確的值,像Oracle這樣取序列的情況,需要設(shè)置為before。
在上面示例的insert用法中,就是order屬性設(shè)置成了BEFORE才導(dǎo)致自增屬性沒有生效。改成AFTER后,主鍵就開始自增了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MyBatis insert語(yǔ)句返回主鍵和selectKey標(biāo)簽方式
- mybatis?selectKey賦值未生效的原因分析
- Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
- mybatis?獲取更新(update)記錄的id之<selectKey>用法說(shuō)明
- mybatis的selectKey作用詳解
- MyBatis如何使用selectKey返回主鍵的值
- Mybatis插入時(shí)返回自增主鍵方式(selectKey和useGeneratedKeys)
- Mybatis @SelectKey用法解讀
- Mybatis示例之SelectKey的應(yīng)用
- MyBatis中selectKey標(biāo)簽及主鍵回填實(shí)現(xiàn)
相關(guān)文章
Java多線程之定時(shí)器Timer的實(shí)現(xiàn)
定時(shí)/計(jì)劃功能在Java應(yīng)用的各個(gè)領(lǐng)域都使用得非常多,比方說(shuō)Web層面。本文主要為大家介紹了Java多線程中定時(shí)器Timer的實(shí)現(xiàn),感興趣的小伙伴可以了解一下2022-10-10
Java實(shí)現(xiàn)FTP服務(wù)器功能實(shí)例代碼
FTP(File Transfer Protocol 文件傳輸協(xié)議)是Internet 上用來(lái)傳送文件的協(xié)議,本文給大家分享Java實(shí)現(xiàn)FTP服務(wù)器功能實(shí)例代碼,對(duì)java實(shí)現(xiàn)ftp服務(wù)器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理
本文介紹了Springboot異步任務(wù)和定時(shí)任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時(shí)任務(wù)是經(jīng)常遇到的處理問(wèn)題方式,為了能夠用好這兩項(xiàng)配置,不干擾正常的業(yè)務(wù),需要對(duì)其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下2022-05-05
解讀List?list=new?ArrayList()是怎么回事
這篇文章主要介紹了解讀List?list=new?ArrayList()是怎么回事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的方法
類型轉(zhuǎn)換器的作用是將請(qǐng)求中的字符串或字符串?dāng)?shù)組參數(shù)與action中的對(duì)象進(jìn)行相互轉(zhuǎn)換。下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05
java設(shè)計(jì)模式之單例模式的詳解及優(yōu)點(diǎn)
這篇文章主要介紹了java設(shè)計(jì)模式之單例模式的詳解及優(yōu)點(diǎn)的相關(guān)資料,如果一個(gè)類始終只能創(chuàng)建一個(gè)實(shí)例,那么這個(gè)類被稱為單例類,這種設(shè)計(jì)模式被稱為單例模式,需要的朋友可以參考下2017-08-08

