MyBatis 主键返回策略
最近在项目中需要用到MyBatis的主键返回策略,感觉官方文档给的例子很简短,上网搜索时又被人所误导,可能也是自己没认真看官方文档,特此记录。
背景
- Mysql 数据库
- 表主键自增(注意当表主键已设置自增时使用下面实现,MyBatis存在两种实现)
先把实现展示下
实现
这个是我最终的实现,其实很简单。
Mapper接口
@Mapper
public interface TagMapper extends BaseMapper<Tag> {
Integer insertTag(Tag tag);
}
xml配置
<insert id="insertTag" useGeneratedKeys="true" keyProperty="id" parameterType="com.fxtahe.blog.entity.Tag">
INSERT INTO tag (tag_name) VALUES (#{tagName})
</insert>
接口调用
@Test
public void testInsertTag(){
Tag tag = new Tag();
tag.setTagName("标签");
tagMapper.insertTag(tag);
// 参数中获取主键id
Integer id = tag.getId();
}
总结
下面记录下我犯的比较蠢的问题,也是对MyBatis不够了解导致
注意:
- 1.接口入参必须为实体类
- 2.接口返回的Integer是插入的行数,并不是返回的主键
看下官网的介绍
如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就 OK 了
xml配置的keyProperty
是将返回的主键设置到入参的实体类中,所以传参为实体类。
selectKey
Mybatis也提供了另一种主键返回的方式,主要是应对不支持自增主键的,把MyBatis官网的内容贴过来
对于不支持自动生成类型的数据库或可能不支持自动生成主键的 JDBC 驱动,MyBatis 有另外一种方法来生成主键。
这里有一个简单(甚至很傻)的示例,它可以生成一个随机 ID(你最好不要这么做,但这里展示了 MyBatis 处理问题的灵活性及其所关心的广度):
<insert id="insertAuthor">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
</selectKey>
insert into Author
(id, username, password, email,bio, favourite_section)
values
(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>
参考: MyBatis官网