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

在MyBatis中,可以通过开启useGeneratedKeys属性或使用selectKey标签来获取插入数据的主键ID。对于自增ID,useGeneratedKeys结合keyProperty可以实现,而selectKey则可以在AFTER插入操作后获取。Java调用时,需通过入参对象的指定字段获取ID。注意此方法仅适用于支持主键自增的数据库,如MySQL和SQLServer。
摘要由CSDN通过智能技术生成

一、背景

在业务开发的时候,由于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 这个值。

MyBatis支持在Mapper XML中使用多个主键进行insertupdate操作。 在Mapper XML,可以使用<selectKey>元素来生成主键,然后将其作为参数传递给insertupdate语句。 例如,假设我们有一个User表,有两个主键分别为id和username。我们可以使用以下Mapper XML来插入一条新的用户记录: ```xml <insert id="insertUser" parameterType="com.example.User"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT NEXTVAL('user_id_seq') </selectKey> INSERT INTO User (id, username, password) VALUES (#{id}, #{username}, #{password}) </insert> ``` 在这个例子中,我们使用<selectKey>元素来生成id主键,然后将其作为参数传递给INSERT语句。 类似地,我们可以使用以下Mapper XML来更新一条用户记录: ```xml <update id="updateUser" parameterType="com.example.User"> UPDATE User SET username = #{username}, password = #{password} WHERE id = #{id} AND username = #{username} </update> ``` 在这个例子中,我们使用id和username两个主键来确定要更新的记录,并且将它们作为参数传递给UPDATE语句。 需要注意的是,如果使用多个主键进行insertupdate操作,那么必须在实体类中定义一个包含所有主键的复合主键类。例如,在上面的例子中,我们可以定义一个UserKey类来表示id和username的复合主键: ```java public class UserKey { private int id; private String username; // getters and setters } ``` 然后,在User类中使用UserKey类作为主键: ```java public class User { private UserKey key; private String password; // getters and setters } ``` 这样,我们就可以在Mapper XML中使用UserKey类来表示复合主键。例如,在上面的例子中,我们可以将UserKey作为参数类型,如下所示: ```xml <insert id="insertUser" parameterType="com.example.UserKey"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT NEXTVAL('user_id_seq') </selectKey> INSERT INTO User (id, username, password) VALUES (#{id}, #{username}, #{password}) </insert> <update id="updateUser" parameterType="com.example.UserKey"> UPDATE User SET password = #{password} WHERE id = #{id} AND username = #{username} </update> ``` 总的来说,使用多个主键进行insertupdate操作并不难,只需要在Mapper XML中正确地配置<selectKey>元素和参数类型即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

forest_long

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

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

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

打赏作者

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

抵扣说明:

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

余额充值