MyBatis插入后自动获取自增主键ID,核心是useGeneratedKeys="true"与keyProperty="id"配合,使数据库生成的ID直接回填到Java对象字段;注解方式用@Options等效实现,注意SQL中勿显式赋值主键列。

MyBatis 插入数据后自动获取自增主键 ID,核心是通过 <insert> 标签的 useGeneratedKeys 和 keyProperty 属性实现,无需额外查询。
配置 useGeneratedKeys + keyProperty(最常用)
适用于 MySQL、PostgreSQL 等支持自增主键的数据库。在 Mapper XML 的 <insert> 中设置:
-
useGeneratedKeys="true":启用 JDBC 的getGeneratedKeys()获取主键 -
keyProperty="id":指定将生成的主键值回填到 Java 对象的哪个字段(如User.id) -
keyColumn(可选):显式指定数据库中主键列名,部分数据库(如 PostgreSQL)建议加上,避免推断错误
示例(UserMapper.xml):
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id"><!-- 注意:不要写 INSERT INTO ... VALUES (#{id}, ...),id 由数据库生成 -->
INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>
Java 调用后直接使用对象 ID
插入成功后,MyBatis 会自动把生成的主键值赋给传入对象的对应字段:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
User user = new User();user.setName("Alice");
user.setEmail("alice@example.com");
userMapper.insertUser(user); // 执行插入
System.out.println(user.getId()); // ✅ 输出数据库生成的自增 ID
注解方式(@Insert + @Options)
若使用注解风格,等价写法如下:
@Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(User user);
调用后同样可直接访问 user.getId()。
注意事项
- 实体类字段名(如
id)需与keyProperty值严格一致,且要有 public setter 方法 - SQL 中不要为自增主键列显式赋值(如
VALUES (#{id}, ...)),否则可能覆盖自增逻辑或报错 - Oracle 不支持自增列,需改用
<selectKey>配合序列;SQL Server 可用IDENTITY_INSERT或OUTPUT,但useGeneratedKeys在较新驱动下也兼容 - MySQL 8.0+ 默认驱动已优化,无需额外配置
rewriteBatchedStatements=true来提升批量插入性能

















