insert返回主键 — mybatis selectKey

Myth丶恋晨 2022-03-20 12:42 405阅读 0赞

日常项目开发中,经常会用到一个场景:在表中新增一条数据,需要得到该条数据的主键ID。如何不额外写一条查询语句来得到新增数据的主键ID呢?mybatis的selectKey实现了这个功能。

mybatis的selectKey在不同数据库中的用法有点区别:

oracle中的用法

  1. <insert id="insertUser" parameterClass="XXX.user">
  2. <selectKey resultClass="long" keyProperty="id"order="BEFORE">
  3. select SEQ_USER_ID.nextval as id from dual
  4. </selectKey>
  5. insert into user (id,name,password)
  6. values (#{id},#{name},#{password})
  7. </insert>

这句话会在插入user之前执行(order=“BEFORE”),该句话执行完之后,通过SEQ_USER_ID.nextval生成一个ID,传进来的参数User对象里的id字段就会被赋值成sequence的值,通过user.id即可获取新增数据的主键ID。

mysql中的用法

  1. <insert id="insertUser" parameterClass="XXX.user">
  2. insert into user (name,password) values (#{id},#{name},#{password})
  3. <selectKeykeyProperty="id" order="AFTER" resultType="java.lang.Integer">
  4. SELECT LAST_INSERT_ID() AS ID
  5. </selectKey>
  6. </insert>

该种用法是通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。插入之后获得ID赋值到传进来的对象中,通过user.id获取。

SelectKey用法详解:

1、SelectKey因为可以很随意的设置生成主键的方式,所以用在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题。使用它可以得到sequence的值(比如用在oracle中,就可以使用SEQ_USER_ID.nextval来生成一个主键),同时也会将值返回。对于不同的数据库有不同的操作方式。

2、SelectKey标签中有一个order属性,在不同的数据库中有不同的用法:
1)在支持自动增长类型的数据库(mysql)中,order需要设置为after才会取到正确的值。新增数据的时候mysql数据库通过自增取得主键ID,然后将值返回;
2)像Oracle这样取序列的情况,需要设置为before。通过序列化方法生成一个主键ID,之后插入数据库。

3、属性
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,405人围观)

还没有评论,来说两句吧...

相关阅读