原创

深入解析 MyBatis 如何返回主键 ID

温馨提示:
本文最后更新于 2025年07月18日,已超过 8 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

一、为什么要获取主键 ID?

学生初学者常见的场景是:插入一条新记录后,需要立即得到其自增主键,用于后续处理(如插表操作、多表关联等)。MyBatis 提供了 useGeneratedKeysselectKey 等机制,实现这一目标。


二、最新权威方式归纳 🔍

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 自动获取自增ID
  • keyProperty:指定赋值给 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 的机制:

  1. 执行 INSERT
  2. JDBC 驱动调用 getGeneratedKeys() 获取主键
  3. MyBatis 将主键回填至实体对象
  4. 插入方法返回插入条数,外部通过实体获取主键

插图清晰展示流程与组件交互:

file


五、完整示例演练 💡

以 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 已自动写入实体。

这是原创且基于最新资料整合的指南,欢迎分享收藏!


🔗 有用的外部链接


希望这篇图文并茂的原创 SEO 文章,能帮助你彻底掌握“如何让 MyBatis 返回主键 ID”!如有问题,欢迎评论区探讨 😊

正文到此结束
本文目录