Mybatis主键返回策略

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官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值