0


【SpringBoot】Mybatis执行insert/update后如何获得主键id

一、背景

在业务开发的时候,由于MyBatis框架的insert语句默认是不返回记录的主键值,而是返回插入的记录条数的,但是如果业务层需要得到插入数据的主键时候,可以通过配置的方式来实现获取插入数据的ID功能。

二、如何解决

方法1、开启useGeneratedKeys属性方法

<!--
      useGeneratedKeys="true" 开启新增主键返回功能
      keyProperty="id" user实体主键属性
      keyColumn="id" user表中主键列
  -->
  <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
     insert into user(username,password) values (#{username},#{password})
  </insert>

方法2、使用<selectKey>和 order="AFTER"方式

  <!--
      keyColumn="id" user表中主键列
      keyProperty="id" user实体主键属性
      resultType="int" user实体主键属性类型
      order="AFTER" 表示此标签内部sql语句在insert执行之前(执行),还是之后执行(执行)
        AFTER  之后执行【在自增主键时】
        BEFORE 之前执行【使用指定主键时】
  -->
  <insert id="insertUser" parameterType="User" >
    <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
      SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user(username,password) values(#{username},#{password})
  </insert>

三、Java调用

在java中调用时候,怎么拿到自增主键?

错误拿取:

int i = tableDataMapper.insertMaster(masterSQL);

System.out.println("主键:"+i); //返回的依旧是 0 或者 1 ,代表执行成功或失败

正确拿取:

tableDataMapper.insertMaster(masterSQL);

System.out.println("主键:"+masterSQL.getId()); //因为上面说了,mybatis会把自增id封装在你的入参bean的指定字段中,所以应该从 入参.get(指定字段) 去获取

四、注意

1、这两种方式都仅支持主键自增类型的数据库 MySQL 和 SqlServer,Oracle不支持,并且设置的ID是自增类型的才行;

2、如果使用INSERT一条语句插入多行数据时, LAST_INSERT_ID() 只会返回插入的第一行数据时产生的值。比如我使用INSERT一次插入了 4 条数据,它们的 id 分别是 1,2,3,4,那么最后返回的ID还是 1 这个值。


本文转载自: https://blog.csdn.net/forest_long/article/details/129400721
版权归原作者 forest_long 所有, 如有侵权,请联系我们删除。

“【SpringBoot】Mybatis执行insert/update后如何获得主键id”的评论:

还没有评论