MyBatis selectKey 标签作用
有时候新增一条数据不仅仅要知道是否插入成功,因为后面的逻辑可能还需要这条新增数据的主键,这时候可以使用selectKey 标签获取自增主键,从而避免再次查询数据库。另外,有些业务需要自定义数据表的主键,这个时候也可以使用selectKey 标签来实现,它可以随意的设置生成主键的方式。
1、selectKey 标签作用1:获取自增主键
通常情况下,新增一条数据信息,其主键ID是数据库自动生成的,一般采用自增的形式。selectKey 标签可以获取这个生成的主键。如下所示:
<insert id="addUser" parameterType="cn.mybatis.entity.User">
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
select LAST_INSERT_ID()
</selectKey>
insert into t_user(name,sex,phone) values (#{name},#{sex},#{phone})
</insert>
UserDao.add(user);
Integer userId = user.getId();
System.out.println("新增用户的id为:" + userId);
selectKey 标签的作用:首先在数据库插入user对象,然后执行 select LAST_INSERT_ID()
获取数据库里自动生成的主键,最后赋值给user对象的id属性。
2、selectKey 标签作用2:自定义主键的生成方式
除了自动生成主键以外,有些业务需要自定义数据表的主键,这个时候也可以使用selectKey 标签来实现,如下所示:
<insert id="addUser" parameterType="cn.mybatis.entity.User">
<selectKey resultType="string" order="BEFORE" keyProperty="id">
select uuid()
</selectKey>
insert into t_user(id,name,sex,phone) values (#{id},#{name},#{sex},#{phone})
</insert>
3、selectKey 标签属性介绍
- keyProperty:对应Java实体类中充当主键的属性名,跟数据库的主键对应;
- order:取值 AFTER 或者 BEFORE。如上例子所述,AFTER 表示在insert执行之后执行
SELECT LAST_INSERT_ID()
,多用获取自增主键;BEFORE 表示在insert执行之前执行select uuid(),适合那种主键不是自增的情况,实现自定义主键。 - resultType:主键类型
4、selectKey 标签与 useGeneratedKeys、keyProperty 属性
其实,获取自增主键的方式除了使用selectKey 标签以外,还可以使用useGeneratedKeys、keyProperty 属性,可以参考:MyBatis keyProperty 属性介绍,相对来说,后者更简洁。