MyBatis获取自动生成主键ID的三种核心方式及适用场景:
一、JDBC方式(数据库支持自增主键)
适用数据库:MySQL/SQL Server等支持AUTO_INCREMENT
或IDENTITY
的数据库
配置方法:
- 在
<insert>
标签中添加useGeneratedKeys
和keyProperty
属性:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name) VALUES(#{name})
</insert>
- 执行插入后,主键自动注入参数对象的
id
属性:
User user = new User();
user.setName("张三");
mapper.insertUser(user);
System.out.println(user.getId()); // 输出生成的主键
原理:通过JDBC的Statement.RETURN_GENERATED_KEYS
机制获取
二、<selectKey>
标签(通用方案)
适用场景:Oracle序列、不支持自增的数据库或需要自定义主键逻辑
配置示例(Oracle序列):
<insert id="insertUser">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT user_seq.nextval FROM dual
</selectKey>
INSERT INTO user(id, name) VALUES(#{id}, #{name})
</insert>
参数说明:
order="BEFORE"
:先获取主键再执行插入(Oracle常用)order="AFTER"
:先插入后获取主键(MySQL可选)resultType
:主键数据类型
三、批量插入获取主键(MySQL特有)
配置方法:
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name) VALUES
<foreach item="item" collection="list" separator=",">
(#{item.name})
</foreach>
</insert>
注意事项:
- 仅MySQL支持批量返回自增ID
- 返回的主键按插入顺序注入集合对象的
id
属性中
✨ 最佳实践建议
- 单条插入:优先用
useGeneratedKeys
(代码最简洁) - Oracle/特殊主键:必须用
<selectKey>
- 批量操作:MySQL可用批量模式,其他数据库需逐条处理
- 陷阱规避:
- 确保
keyProperty
与实体类属性名一致 - 混合使用时
<selectKey>
会覆盖useGeneratedKeys
- 确保