首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Statement.RETURN_GENERATED_KEYS的PreparedStatement

使用Statement.RETURN_GENERATED_KEYS的PreparedStatement
EN

Stack Overflow用户
提问于 2010-11-19 18:47:40
回答 5查看 137.6K关注 0票数 84

一些JDBC驱动程序返回Statement.RETURN_GENERATED_KEYS的唯一方法是执行以下操作:

代码语言:javascript
复制
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做同样的事情的原因是考虑以下场景:

代码语言:javascript
复制
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()。我如何才能做到这一点?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-19 19:59:15

您可以使用带有附加int参数的prepareStatement方法

代码语言:javascript
复制
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)

对于某些JDBC驱动程序(例如Oracle),您必须显式列出所生成键的列名或索引:

代码语言:javascript
复制
PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})
票数 146
EN

Stack Overflow用户

发布于 2010-11-19 19:59:18

你是说像这样的东西?

代码语言:javascript
复制
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);
}
票数 67
EN

Stack Overflow用户

发布于 2010-11-19 19:06:09

现在我身边没有编译器,我会问一个问题来回答:

你试过这个吗?它起作用了吗?

代码语言:javascript
复制
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);
}

免责声明:很明显,我没有编译这篇文章,但是你已经明白了。

PreparedStatementStatement的一个子接口,所以我看不出为什么它不能工作,除非某些JDBC驱动程序有buggy。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4224228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档