MyBatis插入数据后无法返回Form模型ID问题求助
解决MyBatis插入后获取主键为null的问题
一、XML映射文件配置方式
如果你的formMapper使用XML编写SQL,需要在<insert>标签中配置主键返回相关属性:
1. 自增主键(如MySQL的AUTO_INCREMENT)
在<insert>标签添加useGeneratedKeys="true"和keyProperty="id",指定使用数据库生成的主键,并将其赋值给实体类的id属性:
<insert id="insert" parameterType="com.yourpackage.Form" useGeneratedKeys="true" keyProperty="id"> INSERT INTO form(name) VALUES(#{name}) </insert>
2. 非自增主键(如Oracle的序列)
若使用序列生成主键,需通过<selectKey>标签预先生成主键并赋值给实体类,再执行插入:
<insert id="insert" parameterType="com.yourpackage.Form"> <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE"> SELECT FORM_SEQ.NEXTVAL FROM DUAL </selectKey> INSERT INTO form(id, name) VALUES(#{id}, #{name}) </insert>
order="BEFORE"表示先获取序列值再执行插入,适配Oracle这类需提前生成主键的数据库。
二、注解配置方式
如果你的formMapper使用注解编写SQL,需在@Insert注解搭配@Options或@SelectKey注解配置主键返回:
1. 自增主键
@Insert("INSERT INTO form(name) VALUES(#{name})") @Options(useGeneratedKeys = true, keyProperty = "id") int insert(Form form);
2. 非自增主键
使用@SelectKey注解实现:
@Insert("INSERT INTO form(id, name) VALUES(#{id}, #{name})") @SelectKey(statement = "SELECT FORM_SEQ.NEXTVAL FROM DUAL", keyProperty = "id", resultType = Long.class, before = true) int insert(Form form);
三、关键检查项
- 确保实体类
Form的id属性有对应的getter和setter方法,MyBatis需通过setter将生成的主键值注入实体对象。 - 核对数据库表主键配置:若用自增方式,需确认
id字段已标记为自增(如MySQL的AUTO_INCREMENT)。 - 若使用Spring Boot,检查
mybatis.configuration.use-generated-keys等全局配置是否与局部配置冲突。
完成上述配置后,重新执行代码,form.getId()即可获取到插入后的主键值。
内容的提问来源于stack exchange,提问作者kr_Li
相关产品推荐
相关产品推荐

