问题
很多时候,我们需要获取到刚刚插入到数据库的数据的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。
未经允许请勿转载:程序喵 » Mybatis 获取 insert 之后的主键 id