【发布时间】:2011-05-12 13:46:11
【问题描述】:
某些 JDBC 驱动程序返回 Statement.RETURN_GENERATED_KEYS 的唯一方法是执行以下操作:
long key = -1L;
Statement statement = connection.createStatement();
statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
key = rs.getLong(1);
}
有没有办法对PreparedStatement做同样的事情?
编辑
我询问是否可以对 PreparedStatement 执行相同操作的原因考虑以下情况:
private static final String SQL_CREATE =
"INSERT INTO
USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB)
VALUES (?, ?, ?, ?, ?)";
在USER 表中有一个PRIMARY KEY (USER_ID),它是一个BIGINT AUTOINCREMENT(因此您在SQL_CREATE 字符串中看不到它。
现在,我使用PreparedStatement.setXXXX(index, value) 填充?。我想返回ResultSet rs = PreparedStatement.getGeneratedKeys()。我怎样才能做到这一点?
【问题讨论】:
-
很多人误解并使用 PreparedStatement#executeUpdate(arg) 。 Java 文档说
This method with argument cannot be called on a PreparedStatement or CallableStatement.这意味着我们必须使用不带参数的executeUpdate() 即使executeUpdate(arg)方法可以在PreparedStatement 类中继承但我们不必使用它,否则我们会得到SQLException。