MyBatis如何返回插入主键?
提醒:本文主要讲述一下使用MyBatis对MySQL数据库添加记录后获取主键ID的方法,不涉及MS Server或者Oracle,敬请注意。
MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时各记录的主键值。
备注:MyBatis从3.3.1版本开始支持批量添加记录并返回各记录主键字段值。
1、添加单一记录时返回主键ID(方法一)
此种方法主要思路是:使用<insert>标签或者@Insert注解的属性:useGeneratedKeys、keyProperty、keyColumn。下面分别以xml映射器和注解映射器分别详细阐述一下。
1.1、xml映射器
在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。
<mapper namespace="cn.mybatis.mydemo.mapper">
<!-- 插入数据:返回记录主键id值 -->
<insert id="insertPerson" parameterType="cn.mybatis.mydemo.domain.Person" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
insert into t_person(name,sex,age,create_time,update_time)
values(#{name},#{sex},#{age},now(),now())
</insert>
</mapper>
1.2 接口映射器
在接口映射器中通过注解@Options分别设置参数useGeneratedKeys,keyProperty,keyColumn值
// 返回主键字段id值
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into t_person(name,sex,age,create_time,update_time) values(#{name},#{sex},#{age},now(),now())")
Integer insertPerson(Person person);
需要注意的是,在MyBatis中添加操作返回的是记录数并非记录主键id。因此,如果需要获取新添加记录的主键值,需要在执行添加操作之后,直接读取Java对象的主键属性。
Integer rows = sqlSession.getMapper(PersonMapper.class).insertPerson(person);
System.out.println("rows = " + rows); // 添加操作返回记录数
System.out.println("id = " + person.getId()); // 执行添加操作之后通过Java对象获取主键属性值
2、添加单一记录时返回主键ID(方法二)
在上面方法一中,如何获取自增的id呢,估计很多人还有点疑惑,其实原理很简单:当插入数据之后,mybatis再次查询mysql数据库,获得了注解id,然后填充到person对象的id属性的。
这个获取主键的过程,可以通过selectKey看得更清楚:
<insert id="insertPerson" parameterType="cn.mybatis.mydemo.domain.Person">
<selectKey resultType="INTEGER" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into t_person(name,sex,age,create_time,update_time)
values(#{name},#{sex},#{age},now(),now())
</insert>
代码说明:
(1)SELECT LAST_INSERT_ID(): 获取刚刚插入的主键;
(2)keyProperty:表示将返回的值设置到某一列,此处为id;
(3)order:表明此代码相对于insert语句的执行顺序,BEFORE(适用于Oralce等取序列的数据库)/ARTER(适用于MySQL等支持自增长的数据库);
(4)resultType:返回的类型;
3、批量增加记录时返回主键ID
与单条记录插入类似,只不过要注意:parameterType="java.util.List",原理类似,只不过批量插入是针对每个插入对象Person
<mapper namespace="cn.mybatis.mydemo.mapper">
<!-- 插入数据:返回记录主键id值 -->
<insert id="insertPerson" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
insert into t_person(name,sex,age,create_time,update_time)
values
<foreach collection="list" item="item" index="index" separator="," >
(
#{item.name},
#{item.sex},
#{item.age},
now(),
now()
)
</foreach>
</insert>
</mapper>