insert返回主键 — mybatis selectKey
日常项目开发中,经常会用到一个场景:在表中新增一条数据,需要得到该条数据的主键ID。如何不额外写一条查询语句来得到新增数据的主键ID呢?mybatis的selectKey实现了这个功能。
mybatis的selectKey在不同数据库中的用法有点区别:
oracle中的用法
<insert id="insertUser" parameterClass="XXX.user">
<selectKey resultClass="long" keyProperty="id"order="BEFORE">
select SEQ_USER_ID.nextval as id from dual
</selectKey>
insert into user (id,name,password)
values (#{id},#{name},#{password})
</insert>
这句话会在插入user之前执行(order=“BEFORE”),该句话执行完之后,通过SEQ_USER_ID.nextval生成一个ID,传进来的参数User对象里的id字段就会被赋值成sequence的值,通过user.id即可获取新增数据的主键ID。
mysql中的用法
<insert id="insertUser" parameterClass="XXX.user">
insert into user (name,password) values (#{id},#{name},#{password})
<selectKeykeyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
</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、属性
还没有评论,来说两句吧...