如何获取批量插入语句的自动生成键?

3

我希望使用JDBC批处理语句将一批记录插入到数据库(如DB2)中,并获取插入行的自动生成的ID。我该如何使用JDBC API实现?

示例代码:

String SQL_INSERT = "INSERT INTO TABLE1 (CURRENT_TIMESTAMP) VALUES (?) ";

Connection connection = DriverManager.getConnection("jdbc:db2://localhost:900/DATABASE");
PreparedStatement statement = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS);

// first batch
statement.setTimestamp(1, getCurrentTimestamp());
statement.addBatch();

//  second batch
statement.setTimestamp(1, getCurrentTimestamp());
statement.addBatch();

int[] insertedRows = statement.executeBatch();

ResultSet generatedKeys = statement.getGeneratedKeys();

批量语句执行成功,所有行都已插入数据库。但是当调用getGeneratedKeys()检索生成的键时,它返回一个空的ResultSet。有任何想法,为什么会这样?

1
在批量执行中检索生成的键是否受支持取决于实现。JDBC不要求支持它。 - Mark Rotteveel
你尝试过使用int[]String[]来指定自动生成的列的变体吗? - Stavr00
@Stavr00 是的,我已经在PreparedStatement中尝试了变量int[]String[]进行批处理,但在getGeneratedKeys()方法上,ResultSet为空。 - fabfas
您可能需要使用FINAL TABLE特殊对象来返回插入的元素。 - Stavr00
1
JDBC驱动程序支持getGeneratedKeys()方法,否则期望它应该抛出SQLFeatureNotSupportedException异常。 - fabfas
2个回答

1
我已经找到了针对db2的特定解决方案。如果PreparedStatement对象返回自动生成的键,调用DB2PreparedStatement.getDBGeneratedKeys来检索包含自动生成键的ResultSet对象数组。
import com.ibm.db2.jcc.DB2PreparedStatement;

//更多代码在此处

ResultSet[] result = ((DB2PreparedStatement) preparedStatement).getDBGeneratedKeys();

for (int i = 0; i < result.length; i++) {
    while (result[i].next()) {
        ResultSet rs = result[i];
        java.math.BigDecimal generatedKey = rs.getBigDecimal(1);
        System.out.println("Automatically generated key value = " + generatedKey);
    }
}

谢谢您。不过,必须得说,DB2 JDBC驱动程序的开发人员应该感到羞愧!!! - Rob Bygrave

-1
    objPsmt.executeBatch();
    try (ResultSet rs = objPsmt.getGeneratedKeys()) {
        if (rs != null) {
            while (rs.next()) {
                int generatedId = rs.getInt(1);
                generatedIds.add(generatedId);
            }
        }
    } catch (Exception e) {
        LOGGER.error("Exception while generating ids ", e);
    }

你能添加一下你所做的工作的解释吗? - Joseph Budin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接