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

MyBatis 插入数据后自动获取自增主键 ID,核心是通过 <insert></insert> 标签的 useGeneratedKeys 和 keyProperty 属性实现,无需额外查询。
配置 useGeneratedKeys + keyProperty(最常用)
适用于 MySQL、PostgreSQL 等支持自增主键的数据库。在 Mapper XML 的 <insert></insert> 中设置:
-
useGeneratedKeys="true":启用 JDBC 的getGeneratedKeys()获取主键 -
keyProperty="id":指定将生成的主键值回填到 Java 对象的哪个字段(如User.id) -
keyColumn(可选):显式指定数据库中主键列名,部分数据库(如 PostgreSQL)建议加上,避免推断错误
示例(UserMapper.xml):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
INSERT INTO user (name, email) VALUES (#{name}, #{email})
Java 调用后直接使用对象 ID
插入成功后,MyBatis 会自动把生成的主键值赋给传入对象的对应字段:
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></selectkey>配合序列;SQL Server 可用IDENTITY_INSERT或OUTPUT,但useGeneratedKeys在较新驱动下也兼容 - MySQL 8.0+ 默认驱动已优化,无需额外配置
rewriteBatchedStatements=true来提升批量插入性能
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










