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

  有时候插入记录以后须要使用到插入记录的主键,一般是再查询一次来获取主键,可是MyBatis插入记录时能够设置成返回主键id,简化操做,方法大体有两种。java

 

对应实体类:数据库

1 public class User {
2     private int userId;
3     private String userName;
4     private int userAge;
5 }

 

对应DAO类:app

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

 

方法1、使用useGeneratedKeys属性。spa

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

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

useGeneratedKeys:true,表示容许获取自增主键。对象

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

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

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

 

方法2、使用selectKey标签。配置

(1)主键自增的状况。

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

 

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

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

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

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

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

resultType:主键的类型。

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

 

3、总结

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

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

 

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

1     public void save() {
2         User user = new User();
3         user.setUserName("peter");
4         user.setUserAge(20);
5         int rs = userMapper.save(user);
6         System.out.println("插入主键为:" + user.getUserId());
7         System.out.println("插入影响行数:" + rs);
8     }
相关文章
相关标签/搜索