Mybatis @SelectKey用法解讀
Mybatis @SelectKey用法
用處
主要用來解決主鍵自增問題
用法
@SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="clusterId", before=false, resultType=Integer.class)
屬性
keyProperty
語句結(jié)果被設(shè)置的屬性resultType
結(jié)果的類型order
可以被設(shè)置為before和after 如果設(shè)置為 BEFORE,那么它會首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素-這和如 Oracle 數(shù)據(jù)庫相似,可以在插入語句中嵌入序列調(diào)用。statement
和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 語句的映射類型,分別代表 PreparedStatement 和CallableStatement 類型。
注意
SelectKey需要注意order屬性,像Mysql一類支持自動增長類型的數(shù)據(jù)庫中,order需要設(shè)置為after才會取到正確的值。像Oracle這樣取序列的情況,需要設(shè)置為before,否則會報錯。像Oracle這樣取序列的情況,需要設(shè)置為before,否則會報錯。
Mybatis selectKey 采坑筆記
1.現(xiàn)象描述
觀察某張表的數(shù)據(jù)時,發(fā)現(xiàn)設(shè)置了自增屬性的AutoId,在插入數(shù)據(jù)后并不是自增的,而是數(shù)值跳躍著增加的。
2.問題排查
在確認(rèn)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的用法可能有問題!
3. selectKey 用法再認(rèn)識
resultType
表示的是返回主鍵的類型keyProperty
對應(yīng)的domain 對象中需要被賦值的屬性,一般是主鍵order
如果設(shè)置為 BEFORE,那么它會首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語句,然后是 selectKey 元素
4.selectKey用法的坑
SelectKey需要注意order屬性,像MySQL一類支持自動增長類型的數(shù)據(jù)庫中,order需要設(shè)置為after才會取到正確的值,像Oracle這樣取序列的情況,需要設(shè)置為before。
在上面示例的insert用法中,就是order屬性設(shè)置成了BEFORE才導(dǎo)致自增屬性沒有生效。改成AFTER后,主鍵就開始自增了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- MyBatis insert語句返回主鍵和selectKey標(biāo)簽方式
- mybatis?selectKey賦值未生效的原因分析
- Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解
- mybatis?獲取更新(update)記錄的id之<selectKey>用法說明
- mybatis的selectKey作用詳解
- Mybatis?selectKey 如何返回新增用戶的id值
- MyBatis如何使用selectKey返回主鍵的值
- Mybatis插入時返回自增主鍵方式(selectKey和useGeneratedKeys)
- Mybatis示例之SelectKey的應(yīng)用
- MyBatis中selectKey標(biāo)簽及主鍵回填實現(xiàn)
相關(guān)文章
SpringBoot如何返回Json數(shù)據(jù)格式
這篇文章主要介紹了SpringBoot如何返回Json數(shù)據(jù)格式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03IntelliJ IDEA 2020.3 重大特性(新功能一覽)
這篇文章主要介紹了IntelliJ IDEA 2020.3 重大特性(新功能一覽),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12通過使用Byte?Buddy便捷創(chuàng)建Java?Agent
這篇文章主要為大家介紹了如何通過使用Byte?Buddy便捷創(chuàng)建Java?Agent的使用說明,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03詳解Java實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之并查集
并查集這種數(shù)據(jù)結(jié)構(gòu),可能出現(xiàn)的頻率不是那么高,但是還會經(jīng)常性的見到,其理解學(xué)習(xí)起來非常容易,通過本文,一定能夠輕輕松松搞定并查集2021-06-06SpringBoot?AOP統(tǒng)一處理Web請求日志的示例代碼
springboot有很多方法處理日志,例如攔截器,aop切面,service中代碼記錄等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot?AOP統(tǒng)一處理Web請求日志的相關(guān)資料,需要的朋友可以參考下2023-02-02