mybatis 业务问题:插入一条数据并返回最新数据的 id 值

本文整理了MyBatis获取自增主键值的解决方法。一是在mapper层解决,可使用select @@Identity或LAST_INSERT_ID,但前者不适合高并发,后者基于Connection且与table无关;二是使用<insert>中的useGeneratedKeys和keyProperty属性,执行插入语句后可通过对象getter方法获取自增主键值。

解决方法有很多,特此来整理一下

1.在 mapper 层解决

INSERT INTO UserInfo (name ,pwd )   VALUES ('111','435345')   SELECT @@IDENTITY AS Id

注意:select @@Identity 返回自动递增字段的值。非自动的不行哈;

select max(id) from user;

注意:这个方法的缺点是不适合高并发。如果同时插入的时候返回的值可能不准确。 

SELECT LAST_INSERT_ID();

 注意: 1. 每次 mysql 的 query 操作在 mysql 服务器上可以理解为一次“原子”操作, 写操作常常需要锁表, 这里的锁表是 mysql 应用服务器锁表不是我们的应用程序锁表。
   2. 因为 LAST_INSERT_ID 是基于 Connection 的,只要每个线程都使用独立的 Connection 对象,LAST_INSERT_ID 函数 将返回该 Connection 对 AUTO_INCREMENT列 最新的 insert or update* 作生成的第一个 record 的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT 语句插入多条记录,  LAST_INSERT_ID 返回一个列表。
   3. LAST_INSERT_ID 是与 table 无关的,如果向表 a 插入数据后,再向表 b 插入数据,LAST_INSERT_ID 会改变。

2.使用<insert 中的useGeneratedKeys 和 keyProperty 两个属性

1.在Mybatis Mapper文件中添加属性 “useGeneratedKeys”和“keyProperty”,其中 keyProperty 是 Java 对象的属性名,而不是表格的字段名

<insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id">    
        insert into system(name) values(#{name})    
</insert> 

2.Mybatis 执行完插入语句后,自动将自增长值赋值给对象 systemBean 的属性id。因此,可通过 systemBean 对应的 getter 方法获取!


int count = systemService.insert(systemBean);    
        
int id = systemBean.getId(); //获取到的即为新插入记录的ID 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alaia.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值