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