【Java-MyBatis】MyBatis 如何获取自动生成的主键id?
·

MyBatis获取自动生成的主键id详解
在MyBatis中,当向数据库插入数据时(特别是使用自增主键的表),获取自动生成的主键id有两种常用方法:
🛠️ 方法一:useGeneratedKeys + keyProperty(推荐)
适用场景:数据库支持自动生成主键(如MySQL的AUTO_INCREMENT,SQL Server的IDENTITY)
<insert id="insertUser" parameterType="User"
useGeneratedKeys="true"
keyProperty="id"> <!-- id是Java对象的属性名 -->
INSERT INTO user(name, age)
VALUES(#{name}, #{age})
</insert>
原理:
useGeneratedKeys="true":告诉MyBatis使用JDBC的getGeneratedKeys()方法获取数据库生成的主键。keyProperty="id":将获取到的主键值自动注入到参数对象的id属性中。
代码示例:
User user = new User("张三", 25);
userMapper.insertUser(user); // 执行插入
System.out.println("生成的主键ID:" + user.getId()); // 直接获取
故事举例:
小明的快递公司新入职一位员工"张三"。HR系统在插入员工记录时(数据库自增ID),就像给员工发工牌(主键ID)。
MyBatis的useGeneratedKeys像快递扫描枪——插入数据后立即扫描生成的工牌号(主键ID),
并自动贴到"张三"的员工档案(Java对象)上。后续直接用user.getId()就能查看工牌号。
🛠️ 方法二:<selectKey>标签(通用方案)
适用场景:所有数据库(如Oracle的序列,PostgreSQL的SERIAL)
<insert id="insertUser" parameterType="User">
<!-- 插入前获取序列值(Oracle) -->
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT user_seq.nextval FROM dual
</selectKey>
INSERT INTO user(id, name, age)
VALUES(#{id}, #{name}, #{age})
</insert>
或(MySQL插入后获取):
<selectKey keyProperty="id" resultType="long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
关键参数:
order="BEFORE/AFTER":主键获取在插入SQL之前/之后执行keyProperty:主键值注入的Java对象属性resultType:主键数据类型
✅ 总结对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
useGeneratedKeys |
简洁(一行配置) | 依赖数据库驱动支持 | MySQL, SQL Server |
<selectKey> |
数据库通用 | 需写额外SQL | Oracle, PostgreSQL等 |
📌 核心逻辑:
MyBatis通过JDBC底层获取生成的主键,并自动填充到传入的Java对象属性中,因此插入后直接访问该属性即可。

更多推荐



所有评论(0)