Mybatis @SelectKey用法解读
Mybatis @SelectKey用法
用处
主要用来解决主键自增问题
用法
@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自动生成的,示例如下:
<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后,主键就开始自增了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
- MyBatis insert语句返回主键和selectKey标签方式
- mybatis selectKey赋值未生效的原因分析
- Mybatis3中方法返回生成的主键:XML,@SelectKey,@Options详解
- mybatis 获取更新(update)记录的id之<selectKey>用法说明
- mybatis的selectKey作用详解
- Mybatis selectKey 如何返回新增用户的id值
- MyBatis如何使用selectKey返回主键的值
- Mybatis插入时返回自增主键方式(selectKey和useGeneratedKeys)
- Mybatis示例之SelectKey的应用
- MyBatis中selectKey标签及主键回填实现
相关文章
SpringBoot项目中Date类型数据在接口返回的时间不正确的问题解决
如果接口返回的Date类型时间与数据库中datetime不一致,可能是由于没有正确配置时区导致的,解决方法是在yaml配置文件中指定正确的日期格式和时区配置,修改配置并重启项目后,可以获得正确的时间,下面就来介绍一下2024-09-09
SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法
这篇文章主要介绍了SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
Spring Data Envers支持有条件变动纪录的保存和查询的方法
通过spring-data-envers可以很容易的实现数据变动纪录的保存和查询,本文介绍支持有条件变动纪录的保存和查询的方法,通过spring-data-envers很容易的实现变动纪录的保存和查询,只需要增加几个注解就可以,感兴趣的朋友跟随小编一起看看吧2023-10-10
详解mybatis foreach collection示例
这篇文章主要介绍了详解mybatis foreach collection的相关资料,需要的朋友可以参考下2017-10-10


最新评论