mybatis返回主键
mybatis返回主键分为两种情况,第一种数据库支持自增主键,比如mysql、sqlserver;第二种是不支持自增主键,比如oracle
数据库支持自增主键(mysql、sqlserver)
使用insert、update标签中的useGeneratedKeys、keyProperty来获取主键返回值,useGeneratedKeys设置为true,keyProperty设置为主键对应实体类的属性值,如果是联合主键那么属性名用逗号隔开;insert时,返回的是新增记录的主键值、update时返回的时更新记录的主键值
这里拿insert举例,useGeneratedKeys="true" keyProperty="id"
<insert id="insertSelective" parameterType="testmaven.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into user(name,age) values (#{name,jdbcType=VARCHAR},#{age,jdbcType=INTEGER})
</insert>
同理,如果插入多条记录,只要设置了useGeneratedKeys、keyProperty
,同样可以获取主键;
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
insert into user(name,age) values
<foreach collection="list" separator="," item="item">
(#{item.name,jdbcType=VARCHAR},#{item.age,jdbcType=INTEGER})
</foreach>
</insert>
mybatis generator设置方法
我们通常使用generator插件来生成mapper,generator支持主键自动生成,就不需要一个个mapper文件设置了,只要在生成的时候配置一下就可以了。
<!-- !!!! Table Configurations !!!! -->
<table tableName="ss_order"
domainObjectName="Order"
enableCountByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
enableUpdateByExample="false" >
<generatedKey column="id" sqlStatement="MySql" identity="true" ></generatedKey>
</table>
生成的mapper.xml带有useGeneratedKey信息
数据库不支持自增主键(oracle)
在数据库不支持自增主键情况下,需要使用selectKey来返回插入的主键值。
selectKey属性
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
select last_insert_id() as id
</selectKey>
属性名 | 作用 |
---|---|
resultType | selectKey指定sql返回值类型 |
order | 执行顺序,after,表示后执行;before,表示限制性 |
keyProperty | 主键对应实体类中的属性名字 |
插入记录后,获取主键(如mysql)
selectKey中的order=after,代表先执行insert into,后执行selectKey。此处利用mysql的last_insert_id函数来获取最后一条记录的id
<insert id="insert" parameterType="com.mycat.test.model.Test">
INSERT INTO test(name) VALUES(#{name,jdbcType=VARCHAR})
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
select last_insert_id() as id
</selectKey>
</insert>
插入记录前,获取主键(如oracle)
注意,selectKey中的order=before,代表先执行selectKey,后执行insert into。此处利用sequence先获取id值,设置到sql中,然后返回主键。
<insert id="insert" parameterType="com.mycat.test.model.Test">
INSERT INTO test(id,name) VALUES(#{id,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR})
<selectKey resultType="java.lang.Integer"
order="before" keyProperty="id">
select xx_sequence.nextval from dual
</selectKey>
</insert>