JDBC获取INSERT语句自动生成的主键
在 MySQL 的背景下, 通过JDBC使用 INSERT 语句新增了一条数据后, 如何返回刚才这条数据的主键, 已知该表只有一个主键(且自增), 且其它字段都不是唯一字段.
第一方法是用刚才新增的数据通过 SELECT 语句来查询, 但是如果表中有完全相同的字段就无法完成了, 毕竟我们的表中只有主键是唯一的. 而且如果在新增了之后, 马上有人就对它进行了修改, 那也无法获取到, 因此这种方法完全不可行.
第二种方法是通过 max(id) 来获取:
select max(id) from user;
因为主键是唯一且自增的, 因此主键值最大的就是刚才插入的数据的主键. 但是在高并发的情况下可能还是无法保证正确性.
第三种方法是使用 JDBC 提供的方法:
通过Connection 获取 Statement 对象时,提供 Statement.RETURN_GENERATED_KEYS 参数
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
该参数表示在执行了 INSERT 语句后, 可以使用 getGeneratedKeys() 获取自动生成的字段的值(必须是 AUTO_INCREMENT )
getGeneratedKeys() 方法将会返回一个 ResultSet 对象, 其中的第一个数据就是自动生成的值
实例:
Connection conn = DriverManager.getConnection(url,user,password);
String sql = "insert into user (name,password) values ('123','123')";
// 设置参数:将会返回自动生成的值
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 执行插入操作
ps.executeUpdate();
// 获取自动生成的值(如果sql是insert语句,那么第一列就是自动生成的值)
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
System.out.println(rs.getInt(1));
}
第四种方法是使用MySQL提供的函数:
在执行完 INSERT 语句后, 执行 last_insert_id() 方法
select last_insert_id();
但是要注意的是, last_insert_id() 方法是和 table 无关的, 你在a表中插入了数据, 然后又在b表中插入数据, last_insert_id()都会更改.

本文介绍在MySQL环境下,通过JDBC执行INSERT语句后,如何利用多种方法获取自动生成的主键值,包括使用max(id)、last_insert_id()函数及JDBC提供的RETURN_GENERATED_KEYS参数。
2788

被折叠的 条评论
为什么被折叠?



