在数据库操作中,我们经常需要在插入数据后立即获取生成的主键 ID。这种需求在需要维护关联表数据或进行后续业务处理时尤为常见。本文将深入探讨 MyBatis 中获取插入主键的多种实现方式,并解析其底层原理及性能影响。
一、单条数据插入获取 ID
1. useGeneratedKeys 方式(推荐)
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age)
VALUES(#{name}, #{age})
</insert>
- 原理:通过 JDBC 的
Statement.getGeneratedKeys()
方法获取数据库生成的主键 - 优势:无需额外 SQL 查询
- 要求:数据库必须支持自增主键(如 MySQL/AUTO_INCREMENT、PostgreSQL/SERIAL)
useGeneratedKeys
和 keyProperty
是 MyBatis 中用于处理自动生成键(例如自增主键)的两个重要属性。它们主要用于插入操作,以便在插入新记录后获取数据库生成的键值。
useGeneratedKeys
属性
- 用途:
useGeneratedKeys
属性用于指示MyBatis
是否应使用 JDBC 的getGeneratedKeys
方法来获取数据库生成的键值。 - 适用场景:通常用于插入操作中,当你希望在插入记录后自动获取数据库生成的键(如自增 ID)。
- 工作原理:
- 当
useGeneratedKeys
设置为true
时,MyBatis
会在执行插入操作后调用 JDBC 的getGeneratedKeys
方法。 - 这个方法会返回数据库生成的键值(例如,自增的主键 ID)。
- 这要求数据库和 JDBC 驱动程序支持
getGeneratedKeys
方法。
- 当
keyProperty
属性
- 用途:
keyProperty
指定了 MyBatis 应该将生成的键值赋给哪个 Java 对象的属性。 - 工作原理:
keyProperty
的值应该是你的 Java 对象中用于存储生成键的属性名。- 当 MyBatis 获取到生成的键后,它会将键值赋给这个指定的属性。
2. selectKey 方式(通用方案)
<insert id="insertUser">