You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:45:31