3

谁能告诉我为什么下面的方法(executeUpdate)总是返回 1,即使我已指定返回其中生成的密钥?我想在generatedKey变量中获取生成的密钥。它可以很好地PreparedStatement使用getGeneratedKeys,但我想使用Statement.

    public int testQuery(Connection con) {

        int generatedKey = 0;

        try {

            Statement statement = con.createStatement();
            generatedKey = statement.executeUpdate("INSERT INTO profile (fullname) VALUES ('Visruth CV')", Statement.RETURN_GENERATED_KEYS);

        } catch (SQLException e) {          
            e.printStackTrace();
        } finally {
           try { 
               con.close();
           } catch(Exception ex) {
               ex.printStackTrace();
           }
        }
        System.out.println("generated key : "+generatedKey);

        return generatedKey;
    }

根据 的文档executeUpdate(String sql, int autoGeneratedKeys),它说:

Executes the given SQL statement and signals the driver with the given flag about whether the auto-generated keys produced by this Statement object should be made available for retrieval. The driver will ignore the flag if the SQL statement is not an INSERT statement, or an SQL statement able to return auto-generated keys (the list of such statements is vendor-specific).

Parameters:
    sql an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
    autoGeneratedKeys a flag indicating whether auto-generated keys should be made available for retrieval; one of the following constants: Statement.RETURN_GENERATED_KEYS Statement.NO_GENERATED_KEYS
Returns:
    either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
Throws:
    SQLException - if a database access error occurs, this method is called on a closed Statement, the given SQL statement returns a ResultSet object, or the given constant is not one of those allowed
    SQLFeatureNotSupportedException - if the JDBC driver does not support this method with a constant of Statement.RETURN_GENERATED_KEYS
Since:
    1.4
4

2 回答 2

6

它在您粘贴的 javadoc 中说:

returns: either (1) the row count for SQL Data Manipulation Language or (2) 0 for SQL statements that return nothing

它返回 1 因为您总是只插入 1 个值。它不返回生成的密钥。

要获取生成的密钥,您需要运行以下行:

rs = stmt.getGeneratedKeys()

您可以在此处阅读有关此概念的完整教程。

于 2013-05-16T07:39:53.343 回答
2

如果您阅读Returns文档的一部分,它并没有说它将返回生成的密钥。它返回行数或 0。

执行语句后使用getGeneratedKeys()获取生成的密钥。

于 2013-05-16T07:41:40.763 回答