mybatis之KeyGenerator生成主键
MyBatis 主键生成机制全解析:从原生 JDBC 到 KeyGenerator 适配
在数据库插入操作中,主键回填(获取插入后自动生成的主键)是高频需求(如 MySQL 自增 ID、Oracle 序列等)。MyBatis 基于原生 JDBC 主键回填逻辑,封装了 KeyGenerator 接口及其实现类,统一适配不同数据库的主键生成方式。本文从 “原生 JDBC 原理→MyBatis KeyGenerator 接口→三大实现类源码→实战配置” 逐步展开,彻底讲清 MyBatis 主键生成的底层逻辑与使用方法。
前置知识:原生 JDBC 主键回填
MyBatis 的主键生成机制源于 JDBC 原生支持,理解这一基础能更清晰地把握 MyBatis 的封装逻辑。
核心原理
JDBC 通过 PreparedStatement 的 RETURN_GENERATED_KEYS 标识,告知数据库 “需要返回插入生成的主键”,插入后通过 getGeneratedKeys() 获取主键结果集。
原生代码示例(MySQL)
// 1. 建立数据库连接
Connection connection = DriverManager.getConnection(url, username, password);
// 2. 创建 PreparedStatement,指定 RETURN_GENERATED_KEYS 标识
String sql = "INSERT INTO user (user_name, age) VALUES (?, ?)";
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 3. 绑定参数并执行插入
ps.setString(1, "张三");
ps.setInt(2, 20);
ps.executeUpdate(); // 执行插入,返回受影响行数
// 4. 获取生成的主键(结果集仅含主键列)
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
long userId = rs.getLong(1); // 主键列索引从 1 开始
System.out.println("插入的用户ID:" + userId); // 输出如 "插入的用户ID:1001"
}
// 5. 关闭资源(省略)
原生方案的局限
- 数据库兼容性差:MySQL 支持自增 +
RETURN_GENERATED_KEYS,但 Oracle 需通过序列(seq.nextval)生成主键,无法直接用此方案; - 代码冗余:每次插入都需重复 “指定标识→获取结果集” 逻辑;
- 批量插入复杂:批量插入时需手动分配主键到每个对象。