Mybatis @SelectKey用法
用處
主要用來解決主鍵自增問題
用法
1
|
@SelectKey (statement= "SELECT LAST_INSERT_ID()" , keyProperty= "clusterId" , before= false , resultType=Integer. class ) |
屬性
-
keyProperty
語句結果被設置的屬性 -
resultType
結果的類型 -
order
可以被設置為before和after 如果設置為 BEFORE,那么它會首先選擇主鍵,設置 keyProperty 然后執行插入語句。如果設置為 AFTER,那么先執行插入語句,然后是 selectKey 元素-這和如 Oracle 數據庫相似,可以在插入語句中嵌入序列調用。 -
statement
和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 語句的映射類型,分別代表 PreparedStatement 和CallableStatement 類型。
注意
SelectKey需要注意order屬性,像Mysql一類支持自動增長類型的數據庫中,order需要設置為after才會取到正確的值。像Oracle這樣取序列的情況,需要設置為before,否則會報錯。像Oracle這樣取序列的情況,需要設置為before,否則會報錯。
Mybatis selectKey 采坑筆記
1.現象描述
觀察某張表的數據時,發現設置了自增屬性的AutoId,在插入數據后并不是自增的,而是數值跳躍著增加的。
2.問題排查
在確認AutoId的自增屬性設置沒有問題后,開始懷疑是不是insert語句的問題,insert語句是MyBatis Generator自動生成的,示例如下:
1
2
3
4
5
6
7
8
9
|
< 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 用法再認識
-
resultType
表示的是返回主鍵的類型 -
keyProperty
對應的domain 對象中需要被賦值的屬性,一般是主鍵 -
order
如果設置為 BEFORE,那么它會首先選擇主鍵,設置 keyProperty 然后執行插入語句。如果設置為 AFTER,那么先執行插入語句,然后是 selectKey 元素
4.selectKey用法的坑
SelectKey需要注意order屬性,像MySQL一類支持自動增長類型的數據庫中,order需要設置為after才會取到正確的值,像Oracle這樣取序列的情況,需要設置為before。
在上面示例的insert用法中,就是order屬性設置成了BEFORE才導致自增屬性沒有生效。改成AFTER后,主鍵就開始自增了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_37866486/article/details/91800873