一、遇到的坑:selectKey 返回的主键总是null
按照网上帖子说的方式配置了insert语句返回自增主键的查询。如下:
<insert id="insertxxxx" parameterType="com.xxx.xxx.entity.XXXXEntity">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into tbl_xxx(colunm1,colunm2)
values(#{record.itme1},#{record.itme2})
可是,getId()
获取自增主键时总是返回null。
分析原理:
mybatis会将查询出来的自增主键值封装到要插入的数据对象XXXEntity的实例中。
但是注意,你需要检查你的mapper中的输入参数,是否使用了@Param("record")
。record是我自定义对象别名。
xxxxMapper.java:
int insertxxxx(@Param(“record”)XXXXEntity record);
如果使用了别名,那么selectKey 中的 keyProperty应该这样写:
keyProperty="record.id"
如果没有设置别名@Param,可以直接写keyProperty=“id”
接收自增主键时,需要用传入insertxxxx方法的对象.getId()获取。
前提:请确保,你的XXXXEntity 中有字段:id。
否则会报错。
当然你也可以使用其他字段,代替字段id。写法完全相同。
二、另一种获取insert之后的自增主键的方式:
<insert id="insertAAAA" useGeneratedKeys="true" keyProperty="id" parameterType="com.xxxxx.entity.AAAAEntity">
insert into aaaa
values (#{ssss})
</insert>
在可以实现自增主键的数据库中,这么配置也可以获取到insert之后的表的自增主键。
官网解释如下:
网址:https://mybatis.org/mybatis-3/zh/configuration.html#properties
三、总结:mybatis中想在insert语句中获取自增主键的方式有两种。
第一种:在isnert标记块内部的insert语句前面,或者后面都可以。因为order=“AFTER”,代表的是:插入后,再获取主键值。
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
第二种:直接在insert标记行中增加字段:
<insert id="insertAAAA" useGeneratedKeys="true" keyProperty="id" ......>
<完>