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才可以获得自增字段的值。读者在使用这一特性获得自增字段值时应注意这一点。