MyBatis获取主键的3种高效方式解析

MyBatis获取自动生成主键ID的三种核心方式及适用场景:


一、JDBC方式(数据库支持自增主键)

适用数据库:MySQL/SQL Server等支持AUTO_INCREMENTIDENTITY的数据库
配置方法

  1. <insert>标签中添加useGeneratedKeyskeyProperty属性:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO user(name) VALUES(#{name})
</insert>
  1. 执行插入后,主键自动注入参数对象的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>

注意事项

  1. 仅MySQL支持批量返回自增ID
  2. 返回的主键按插入顺序注入集合对象的id属性中

✨ 最佳实践建议

  1. 单条插入:优先用useGeneratedKeys(代码最简洁)
  2. Oracle/特殊主键:必须用<selectKey>
  3. 批量操作:MySQL可用批量模式,其他数据库需逐条处理
  4. 陷阱规避
    • 确保keyProperty与实体类属性名一致
    • 混合使用时<selectKey>会覆盖useGeneratedKeys
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值