• 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     }
  • 相关阅读:
    微服务架构下分布式事务解决方案——阿里GTS
    兼容IE8以下,获取className节点的元素(document.getElementsByClassName()兼容写法)。
    解决移动端ios下overflow-x scroll无法隐藏滚动条的问题
    skeleton在心意web上的实践
    小程序开发笔记(八)—Js数组按日期分组显示数据
    小程序开发笔记(七)—加入内容安全检测
    使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用
    vuex无法获取getters属性this.$store.getters.getCurChildId undefined
    函数防抖节流的理解及在Vue中的应用
    Javascript Object常用方法总结
  • 原文地址:https://www.cnblogs.com/pcheng/p/10875461.html
Copyright © 2020-2023  润新知