• MyBatis中id回填的两种方式


    在一种场景下需要刚刚插入数据的ID,如果数据少可以先看数据库,记下ID,但数据很多,假设一万个用户并发,每个用户都插入自己的ID,就很难记下来。

    下面给定一个场景:

    User user = new User("张三","123456",new Date());//此时user没有id
    userDao.insertUser(user);
    sqlSession.commit();//此时数据已经插入到数据库中,数据库中有id,但user依然没有id
    System.out.println(user.getId());//没有id
     //则无法得知插入的数据是哪一条,如果后续程序需要此id,则出现bug!
    

    在MyBatis中有两种解决方案:

    方案一:用last_insert_id() 函数,查询刚插入的id

    <insert id="insertUser">
      <selectKey keyProperty="id" resultType="int" order="AFTER">
         select last_insert_id()
      </selectKey>
       insert into user(username,password,access) values (#{username},#{password},#{access})
    </insert>
    
    keyProperty="id" 拿到当前新数据的id给到方法的参数的那个属性  
    resultType="int" 返回的id类型
    order="AFTER" 在插入语句执行之后执行  
    select last_insert_id() 是在获取当前事务的最近一次插入的数据的id  下图是验证:
    

    在这里插入图片描述

    方案二:useGenerateKeys 和 keyProperty属性

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
       insert into user(username,password,access) values (#{username},#{password},#{access})
    </insert>
    //useGeneratedKeys="true"  是否使用了主键自增
    

    两个方案没有本质的区别,推荐用第二种方案,第二种只是简单而已。

    下面可以来测试一下:

    在这里插入图片描述

    下图可以看到id还没有值
    在这里插入图片描述

    跟进:得到了id,并存入了User。

    在这里插入图片描述

  • 相关阅读:
    c基础
    一维数组,字符数组
    循环结构
    分支结构
    结构体
    Python简介和入门
    Python基础(一)
    Markdown 基础学习
    PyCharm 专业版安装
    Python基础(二)
  • 原文地址:https://www.cnblogs.com/npeng/p/12252268.html
Copyright © 2020-2023  润新知