MyBatis插入记录时返回主键id的方法

时间:2022-06-13 19:39:32

  有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种。

对应实体类:

 public class User {
private int userId;
private String userName;
private int userAge;
}

对应DAO类:

 public interface UserMapper {
int save(User user);
}

方法一、使用useGeneratedKeys属性。

 <insert id="save" useGeneratedKeys="true" keyProperty="userId" keyColumn="id">
INSERT INTO user (id, name, age)
VALUES (UUID(), #{userName}, #{userAge})
</insert>

该方法只支持主键非自增的情况。只需要在插入的方法标签上,添加useGeneratedKeys、keyProperty、keyColumn三个属性。

useGeneratedKeys:true,表示允许获取自增主键。

keyProperty:表示实体对象中主键的属性名称。

keyColumn:表示数据库中主键的字段名称。

使用的时候,就正常调用这个方法就好,会将返回的主键存入参数User实体的userId属性中(详见最后说明)。

方法二、使用selectKey标签。

(1)主键自增的情况。

 <insert id="save">
<selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user (name, age)
VALUES (#{userName}, #{userAge})
</insert>

(2)主键非自增的情况。

 <insert id="save">
<selectKey keyProperty="userId" order="BEFORE" resultType="java.lang.String">
SELECT UUID()
</selectKey>
INSERT INTO user (id, name, age)
VALUES (#{userId}, #{userName}, #{userAge})
</insert>

在插入的方法标签里,加入selectKey标签,对应属性说明如下:

keyProperty:表示实体对象中主键的属性名称。

order:表示该标签执行的先后,值分为BEFORE、AFTER。主键自增的情况下使用AFTER,在插入操作后获取到主键;主键非自增的情况下使用BEFORE,在插入操作前获取到主键。

resultType:主键的类型。

使用的时候,就正常调用这个方法就好,会将返回的主键存入参数User实体的userId属性中(详见最后说明)。

三、总结

  方法一写起来比较简洁,但是不支持主键非自增的情况。方法二则相对灵活,可以根据主键是否自增进行对应的配置。且在主键非自增情况下,主键是可以根据自己需求进行调整的,即SELECT UUID()这句,可以调整如下:

 SELECT upper(replace(UUID(), '-', ''))

  PS:save方法的返回值是插入所影响的行数,并不是主键;主键的返回方式,两种方法是一样的,都是通过传入参数User实体的userId属性来获取,如下:

     public void save() {
User user = new User();
user.setUserName("peter");
user.setUserAge(20);
int rs = userMapper.save(user);
System.out.println("插入主键为:" + user.getUserId());
System.out.println("插入影响行数:" + rs);
}