深入解析 MyBatis 如何返回主键 ID
温馨提示:
本文最后更新于 2025年07月18日,已超过 8 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
一、为什么要获取主键 ID?
学生初学者常见的场景是:插入一条新记录后,需要立即得到其自增主键,用于后续处理(如插表操作、多表关联等)。MyBatis 提供了 useGeneratedKeys
和 selectKey
等机制,实现这一目标。
二、最新权威方式归纳 🔍
1. XML 中配置 useGeneratedKeys
适用于支持 JDBC getGeneratedKeys()
的数据库(如 MySQL、H2)。示例如下:
<insert id="addUser" parameterType="User"
useGeneratedKeys="true"
keyProperty="id"
keyColumn="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
useGeneratedKeys="true"
:启用 JDBC 自动获取自增IDkeyProperty
:指定赋值给 JavaBean 的属性keyColumn
(可选):明确列名,推荐配置在 Oracle/PostgreSQL 等情形(博客园, CSDN, Google 群组, Stack Overflow)。
✅ 实践提醒:MyBatis 插入方法返回的是影响行数,主键值会回写到参数对象里(恩玛尔维)。
2. 注解方式:@Options
对于 Spring+MyBatis 初学者,用法清晰简洁:
@Mapper
public interface UserMapper {
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(User user);
}
- 方法返回插入条数,
user.id
会自动更新为主键。
3. 传统方式:<selectKey>
兼容性更好,适合不完全支持 JDBC 获取关键列的数据库:
<insert id="addStudent" parameterType="Student">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO student(name, age) VALUES(#{name}, #{age})
</insert>
order="AFTER"
保证先插入后执行,通过语句获取主键(CSDN)。
三、对比总结一览表
方法 | 优势 | 可用数据库 |
---|---|---|
useGeneratedKeys |
简洁、高效、自动赋值 | MySQL、H2、SQLServer、Oracle*等 |
@Options |
注解方式,集成 Spring Boot 很方便 | 同上 |
selectKey |
跨库支持、灵活,可自定义获取逻辑 | 全部 JDBC 支持的数据库 |
* 对 Oracle/PostgreSQL 成功使用时,请务必指定 keyColumn
(CSDN, Stack Overflow, Baeldung, Stack Overflow)。
四、配图解流程图解析
以下流程简图展示了 MyBatis 中 useGeneratedKeys
的机制:
- 执行
INSERT
- JDBC 驱动调用
getGeneratedKeys()
获取主键 - MyBatis 将主键回填至实体对象
- 插入方法返回插入条数,外部通过实体获取主键
插图清晰展示流程与组件交互:
五、完整示例演练 💡
以 Spring Boot + MyBatis 为例:
// 实体类
public class Car {
private Long id;
private String model;
// getters/setters
}
// Mapper 接口
@Mapper
public interface CarMapper {
@Insert("INSERT INTO car(model) VALUES(#{model})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int save(Car car);
}
// 使用过程
Car car = new Car();
car.setModel("Tesla");
carMapper.save(car);
Long newId = car.getId(); // 新增记录的主键
如需兼容性更强,可替换为 XML + <selectKey>
方式。
六、小结
- 学生级初学者推荐首选:
useGeneratedKeys + keyProperty
; - 注解方式简洁,XML 更灵活;
- 确保配置
keyColumn
可避免兼容性问题; - 插入接口返回的是条数,key 已自动写入实体。
这是原创且基于最新资料整合的指南,欢迎分享收藏!
🔗 有用的外部链接
- Baeldung:MyBatis+Spring Boot 获取自增主键技巧(Teradata 客户支持门户, MyBatis, CSDN, Medium, CSDN)
- CSDN 博客:三种主键回写方式详解(CSDN)
- StackOverflow:注解实战推荐用
@Options
(Stack Overflow)
希望这篇图文并茂的原创 SEO 文章,能帮助你彻底掌握“如何让 MyBatis 返回主键 ID”!如有问题,欢迎评论区探讨 😊
正文到此结束
- 本文标签: mybatis Java Spring Boot
- 本文链接: https://code.itptg.com/article/38
- 版权声明: 本文由老魏原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权