一些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()
。我如何才能做到这一点?
发布于 2010-11-19 19:59:15
您可以使用带有附加int
参数的prepareStatement
方法
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
对于某些JDBC驱动程序(例如Oracle),您必须显式列出所生成键的列名或索引:
PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})
发布于 2010-11-19 19:59:18
你是说像这样的东西?
long key = -1L;
PreparedStatement preparedStatement = connection.prepareStatement(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
preparedStatement.setXXX(index, VALUE);
preparedStatement.executeUpdate();
ResultSet rs = preparedStatement.getGeneratedKeys();
if (rs.next()) {
key = rs.getLong(1);
}
发布于 2010-11-19 19:06:09
现在我身边没有编译器,我会问一个问题来回答:
你试过这个吗?它起作用了吗?
long key = -1L;
PreparedStatement statement = connection.prepareStatement();
statement.executeUpdate(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
key = rs.getLong(1);
}
免责声明:很明显,我没有编译这篇文章,但是你已经明白了。
PreparedStatement是Statement的一个子接口,所以我看不出为什么它不能工作,除非某些JDBC驱动程序有buggy。
https://stackoverflow.com/questions/4224228
复制相似问题