insert操作后返回数据库自动增长的的id 使用selectKey

在使用MyBatisGenerator时,发现自增主键AutoId在插入数据后并未按预期自增,而是数值跳跃。问题出在`selectKey`标签的`order`属性上,当设置为BEFORE时,对于MySQL这类支持自增的数据库,应当改为AFTER,以确保在插入数据后获取正确的自增ID。修改order属性后,主键开始正常自增。

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后,主键就开始自增了。
————————————————
版权声明:本文为优快云博主「灿若繁星」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/song19890528/article/details/80680313

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值