在mapper.xml文件中的insert语句中添加属性
useGeneratedKeys=“true” keyProperty=“goodsId”
[keyProperty]:指定存放生成主键的属性
[resultType]:生成主键所对应的Java类型
要注意这个时候返回的字段的值是直接映射到你插入时候的对象中而不是insert方法的返回值,插入数据成功一条当然返回的是1了。
mybatis底层是用synchronize代码块修饰了的,所以获取的一定是刚刚插入的数据的id。
即使加入了事务,也就是说这个插入的数据还没有提交,一样可以获取到刚插入数据但是还没有提交的id
那这个是框架做到的呢还是说MySQL的语句select LAST_INSERT_ID()
本身就是可以获取未提交的值呢?
下面实验说明:
开启事务插入数据
此时查看数据库中确实不存在数据,说明事务已经开启了 。
然后查询,发现结果是0,那么我们提交在次查询
发现返回值一直是0????
注意:select LAST_INSERT_ID()只能获取自增的主键的值,自己指定的是无法获取的。
下图很好的说明了这个问题
那么我们下面继续验证如果开启事务,没有提交的情况下获取的自增主键的值是什么呢?
结论的出来了吧:数据库本身就支持这个函数获取没有提交事务的自增主键的值。
那这个时候如果我们回滚并再次获取会是什么情况呢?
可以发现即使回滚了,也会得到刚才未提交的值。