java中获取自增主键的核心是调用preparedstatement的getgeneratedkeys()方法:需传入statement.return_generated_keys参数创建预编译语句,执行executeupdate()后调用getgeneratedkeys()获取resultset,并通过rs.next()和rs.getlong(1)等读取主键值。

Java 中获取自增主键的值,核心在于执行插入操作后,从数据库驱动中“取出”数据库刚生成的主键值。这通常通过 JDBC 的 Statement 或 PreparedStatement 的 getGeneratedKeys() 方法实现,而不是在 Java 里自己计算或查询。
使用 PreparedStatement + getGeneratedKeys()
这是最常用、最推荐的方式,适用于 MySQL、PostgreSQL、SQL Server 等主流数据库(需驱动支持)。
- 创建
PreparedStatement时,传入参数Statement.RETURN_GENERATED_KEYS - 执行
executeUpdate()插入数据 - 调用
getGeneratedKeys()获取结果集,一般只有一列(如id) - 遍历结果集读取主键值(通常是
getInt(1)或getLong(1))
示例(MySQL):
String sql = "INSERT INTO user(name, email) VALUES(?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, "张三");
ps.setString(2, "zhangsan@example.com");
ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
int id = rs.getInt(1); // 获取第一个字段,即自增主键
System.out.println("插入成功,主键为:" + id);
}
}
}
指定主键列名(更安全的做法)
某些数据库(如 PostgreSQL)可能返回多个自动生成的列,或字段名不固定。此时可显式传入列名数组,避免依赖顺序。
- 将
Statement.RETURN_GENERATED_KEYS替换为列名数组,例如new String[]{"id"} - 这样
getGeneratedKeys()返回的结果集只包含指定列,语义更明确
示例:
String[] keyCols = {"id"};
try (PreparedStatement ps = conn.prepareStatement(sql, keyCols)) {
// ... 设置参数、执行
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
long id = rs.getLong("id"); // 用列名读取,更清晰
}
}
}
MyBatis 中怎么获取自增主键
MyBatis 提供了更简洁的封装:
- XML 映射中,在
<insert></insert>标签添加useGeneratedKeys="true"和keyProperty="id" -
keyProperty指定将生成的主键赋值给实体类的哪个字段(如id) - 如果是 MySQL,还可加
keyColumn="id"明确数据库列名(非必需)
示例:
<insert id="insertUser" usegeneratedkeys="true" keyproperty="id">
INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
调用后,传入的 User 对象的 id 字段会被自动赋值。
注意事项和常见问题
-
必须用 executeUpdate(),不能用 execute():只有
executeUpdate()才保证能拿到生成键;execute()可能返回 false 导致getGeneratedKeys()报错 -
数据库和驱动要匹配:例如 MySQL 8+ 推荐用
mysql-connector-java:8.0.x,旧驱动对 generated keys 支持不完善 - 事务内才可靠:如果插入失败回滚,自然拿不到有效主键;确保异常时正确处理事务
-
Oracle 不适用此方式:Oracle 常用序列(SEQUENCE),需先查序列再插入,或用
RETURNING子句(JDBC 4.0+ 支持)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











