方式一: 插入数据之后查询最大主键值,不适合高并发等场景

  1. SELECT @@IDENTITY
  2. select last_insert_id()
  3. 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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐