MyBatis-Plus 设置主键自增并获取生成 ID 的完整指南
在使用 MyBatis-Plus 进行持久层开发时,数据库主键自增是最常见的场景。开发者常遇到的问题是:执行 insert 操作后,实体对象中的 ID 字段未能自动填充。本文将解析如何通过实体注解和全局配置启用自增,并演示三种能成功将数据库生成的 ID 回填到 Java 对象的方法。
核心解决方案:配置自增并获取 ID
要实现自增主键且能在 Java 代码中直接读取返回的 ID,关键在于正确配置 MyBatis-Plus 的主键类型策略。以下是具体的实施步骤和方法。
第1步:实体类配置主键自增策略
首先,需要在对应的 POJO 实体类中标记主键字段为自增。使用 @TableId 注解并将 type 属性设置为 IdType.AUTO。
import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
@Data
@TableName("users")
public class User {
// 指定 id 为主键,且策略为自增
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 普通字段,注意处理特殊字符转义
@TableField("`name`")
private String name;
}配置要点:
value = "id":映射数据库中的列名。type = IdType.AUTO:告诉框架该字段由数据库自动生成,框架在插入时会忽略该字段值,并在插入成功后尝试回填。
第2步:全局配置(可选但推荐)
为了统一所有实体的默认行为,建议在 application.yml 中配置全局数据库策略。这可以避免在每个实体类上重复添加注解。
mybatis-plus:
global-config:
db-config:
id-type: auto此配置确保了除非显式指定其他策略,否则所有表的主键都将按自增处理。
第3步:选择获取自增 ID 的方法
配置完成后,需要确保在执行插入操作时,框架能将数据库生成的 ID 赋值给 Java 对象。以下是三种常用方法:
方法一:使用 MyBatis-Plus 内置 insert 方法(推荐)
这是最简洁的方式。MyBatis-Plus 的 BaseMapper 提供的 insert 方法已经适配了大多数关系型数据库,能够自动处理自增 ID 的回填。
// Service 层调用示例
User user = new User();
user.setName("张三");
userMapper.insert(user);
// 此时 user.getId() 即为数据库生成的自增 ID方法二:使用自定义 XML Mapper 和 @Options 注解
如果需要通过原生 SQL 插入,可以使用 @Options 注解来开启 JDBC 3.0 标准返回键的功能。
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
public interface UserMapper extends BaseMapper<User> {
@Insert("INSERT INTO users (`name`) VALUES (#{user.name})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int add(@Param("user") User user);
}参数说明:
useGeneratedKeys = true:启用返回由数据库内部生成的主键。keyProperty = "id":指定将返回的值赋给 Java 对象的哪个属性。keyColumn = "id":指定数据库中对应的主键列名。
方法三:使用 Provider 动态 SQL
对于复杂的动态 SQL,可以使用 @InsertProvider 配合 @Options。
Mapper 接口定义:
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
public interface UserMapper extends BaseMapper<User> {
@InsertProvider(type = UserMapperProvider.class, method = "add")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int add(@Param("user") User user);
}Provider 类实现:
public class UserMapperProvider {
public String add(User user) {
// 注意:即使传入的 entity.id 可能为 null,数据库也会处理自增
return "INSERT INTO users (id, `name`) VALUES (#{user.id}, #{user.name})";
}
}验证 ID 是否回填成功
在实际开发中,建议通过日志或调试模式观察 Entity 对象的变化,以确保 ID 正确回写。
如图所示,在执行插入前的断点查看,User 对象的 ID 字段通常为 null 或默认初始值。而在插入语句执行完毕后的断点查看,ID 字段应包含数据库新生成的值。
若发现 ID 仍未回填,请检查以下几点:
- 确认数据库表中
id列确实已设置为AUTO_INCREMENT(MySQL)或等价属性。 - 检查实体类
@TableId的type是否为IdType.AUTO。 - 如果是自定义 SQL,确认
@Options注解未被遗漏或属性名拼写错误。
此外,正确的实体配置样式参考如下:
以上就是 MyBatis-Plus 新增获取自增列 id 方式的详细内容,更多关于 MyBatis-Plus 自增主键配置的教程资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









