Mybatis 获取 insert 之后的主键 id

问题

很多时候,我们需要获取到刚刚插入到数据库的数据的id是什么,这里的id可能有两种情况,一种是自增长的id,另外一种情况是用户自定义的id,例如生成的uuid。

insert完成之后再去查询得到id,这样显然不太合适,很可能获取到的id不是自己想要的那条数据的id,只有在insert的过程中获取到id,再将其包装在结果集中一起返回,这样才能万无一失,保证返回id的准确性。

实现方法

实现方法:mybatis的selectKey标签配合sql语句就可以实现这一需求

方法一

在 insert 标签上,添加 useGeneratedKeys=true 是使用生成的主键的意思,keyProperty 属性表示要查询的主键的名字,就是主键字段对应实体类的属性。

<insert id="insert" parameterType="xxx" useGeneratedKeys="true" keyProperty="id" keyColumn="id">

方法二

<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
	SELECT LAST_INSERT_ID()
</selectKey>

order 属性有两个值,即 AFTER,BEFORE

  • AFTER:表示在insert之后执行SELECT LAST_INSERT_ID(),一般用于主键自增时,得到的就是自增长生成的id,

  • BEFORE:表示在insert之前执行SELECT LAST_INSERT_ID(),一般用于非自增主键,得到的是传入的对象中主键的值,一般是用户生成的uuid。

resultType属性表示主键的类型,一般要么是Integer,要么是String

将该selectKey标签的内容放入insert标签语句中就ok了,例如:

<insert id="insertSelective" parameterType="com.xxx.xxx.po.StoryComments">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      SELECT LAST_INSERT_ID()
    </selectKey>
    
    insert into story_comments
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="storyId != null">
        story_id,
      </if>
      ...
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="storyId != null">
        #{storyId,jdbcType=INTEGER},
      </if>
      ...
    </trim>
  </insert>

注意

到这里,你肯定认为这个返回的是你想要的id 

错了,这个返回的是影响的行数,影响的行数,影响的行数 

如果要ID那么就到实体里面去getId就可以了 

也就是说mybatis把得到的id封装到实体的ID属性里面去了比如 你调用userDao.save(someone)来保存, mybatis会将id封装到someone中,如下图 themeRuleGroup.getId() 才是真正的主键id。

Foxmail20191212110333.png


未经允许请勿转载:程序喵 » Mybatis 获取 insert 之后的主键 id

点  赞 (3) 打  赏
分享到: