zoukankan      html  css  js  c++  java
  • MyBatis插入记录时返回主键id的方法

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

    对应实体类:

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

    对应DAO类:

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

    方法一、使用useGeneratedKeys属性。

    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三个属性。

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

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

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

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

    方法二、使用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属性中(详见最后说明)。

    三、总结

      方法一写起来比较简洁,但是不支持主键非自增的情况。方法二则相对灵活,可以根据主键是否自增进行对应的配置。且在主键非自增情况下,主键是可以根据自己需求进行调整的,即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     }
  • 相关阅读:
    埋点笔记整理02
    数据可视化笔记整理02
    埋点笔记整理01
    数据可视化笔记整理01
    魔力Python——我踩过的各种坑
    我们的竞争对手在看向哪里---对勺海公众号的挖掘与细分
    JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)
    Vue封装axios
    JAVA_基础反射机制
    dispaly的Grid布局与Flex布局
  • 原文地址:https://www.cnblogs.com/pcheng/p/10875461.html
Copyright © 2011-2022 走看看