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()
都会更改.