解决方法有很多,特此来整理一下
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