码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis中id回填的两种方式

时间:2020-02-02 16:14:32      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:image   主键   comm   font   图片   执行   strong   ssi   自增   

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

下面给定一个场景:

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

在MyBatis中有两种解决方案:

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

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

技术图片

方案二:useGenerateKeys 和 keyProperty属性

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

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

 

 

 下面可以来测试一下:

 技术图片

下图可以看到id还没有值

技术图片

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

技术图片

 

 

 

 

 

 

 

 

 

 

 

MyBatis中id回填的两种方式

标签:image   主键   comm   font   图片   执行   strong   ssi   自增   

原文地址:https://www.cnblogs.com/npeng/p/12252268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!