2.3.3 获得自增字段的值
优质
小牛编辑
134浏览
2023-12-01
有很多数据库都支持自增类型字段,但在插入数据时,同时获得自增字段的值是比较麻烦的。但如果使用JDBC,就非常容易做到这一点。
在Statement接口中提供了一个getGeneratedKeys方法,可以获得最近一次插入数据后自增字段的值。getGeneratedKeys()方法的定义如下:
ResultSet getGeneratedKeys() throws SQLException;
getGeneratedKeys方法返回一个ResultSet对象,第一个字段的值就是自增字段的值。如果同时插入多条记录,可使用next()方法对ResultSet对象进行扫描。
使用execute方法和executeUpdate方法都可以获得自增字段的值,如果执行多条INSERT语句,则只返回第一条INSERT语句生成的自增字段的值。下面的代码演示了如何用getGeneratedKeys()方法获得自增字段的值:
public class AutoGeneratedKeyValue
{
public static void main(String[] args) throws Exception
{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb?characterEncoding=UTF8", "root", "1234");
Statement stmt = conn.createStatement();
String insertData1 = "INSERT INTO t_booksale(bookid, amount, saledate) VALUES(1, 20, '2004-10-10')";
String insertData2 = "INSERT INTO t_booksale(bookid, amount, saledate) SELECT bookid,amount,saledate FROM t_booksale";
stmt.execute(insertData1);
ResultSet rs = stmt.getGeneratedKeys(); // 获得单个递增字段值
if (rs.next())
{
System.out.println("自增自段的值: " + rs.getString(1));
System.out.println("-------------------------------");
}
stmt.executeUpdate(insertData2);
rs = stmt.getGeneratedKeys(); // 获得多个递缯字段值
while (rs.next())
{
System.out.println("自增自段的值: " + rs.getString(1));
}
stmt.close();
conn.close();
}
}
除此之外,还可以通过execute和executeUpdate方法来控制是否可以获得自增字段的值,代码如下:
// 无法获得自增字段的值
stmt.execute(insertData1, Statement.NO_GENERATED_KEYS);
// 可以获得自增字段的值
stmt.execute(insertData1, Statement. RETURN_GENERATED_KEYS);
// 无法获得自增字段的值
stmt.executeUpdate(insertData1, Statement.NO_GENERATED_KEYS);
// 可以获得自增字段的值
stmt.executeUpdate(insertData1, Statement. RETURN_GENERATED_KEYS);
对于MySQL数据库来说,使用NO_GENERATED_KEYS和RETURN_GENERATED_KEYS都可以获得自增字段值,也就是说MySQL JDBC忽略了这个参数。而对于其它数据库的JDBC驱动,就未必是这个结果。如SQL Server2005 JDBC就必须使用Statement. RETURN_GENERATED_KEYS才可以获得自增字段的值。读者在使用这一特性获得自增字段值时应注意这一点。