方式一: 插入数据之后查询最大主键值,不适合高并发等场景
SELECT @@IDENTITY
select last_insert_id()
select max(id) from user
- 我本人在navicat测试,插入完成之后,在新窗口分别测试三条语句,前两条查询不到最新的。如果插入和查询在同一个窗口,则均没有问题,我猜测可能是因为打开新查询窗口,相当于一个新的连接,导致查询错误。1,2查询的是最后插入对应的ID,就算执行了删改操作。
方式二:插入并直接返回主键,利用的是创建存储过程,在存储过程中调用先插入再获取最大值的操作
DELIMITER $$
DROP PROCEDURE IF EXISTS `test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name varchar(100),out oid int)
BEGIN
insert into user(name) values('ss');
select max(id) from user into oid;
select oid;
END $$
DELIMITER ;
call test('gg',@id);
方式三: 用xml方式
1.
<insert id="insert" parameterType="map">
insert into table1 (name) values (#{name})
<selectKey resultType="java.lang.Integer" keyProperty="id">
CALL IDENTITY()
</selectKey>
</insert>
直接就可以从map中获取id
2.
<insert id="insert" parameterType="int"
useGeneratedKeys="true" keyProperty="id">
insert into system(name) values(#{name})
</insert>
返回值是一个int类型,用来接收id