jdbc 有效地获取生成的密钥以及其他数据

Posted

技术标签:

【中文标题】jdbc 有效地获取生成的密钥以及其他数据【英文标题】:jdbc get generatedKeys along with other data efficieintly 【发布时间】:2011-12-16 18:06:35 【问题描述】:

批量插入多行后,我希望检索生成的键及其对应的插入行。我如何有效地做到这一点? 我可以天真地使用 statement.getGeneratedKeys() 根据每个生成的 id 查询数据库中的每一行,但这似乎很慢。 下面的代码执行批量插入,然后遍历表中的所有结果,但是我不想包含插入之前表中已经存在的数据。 有其他选择吗?

公共静态 void main(String[] args) 抛出异常 连接连接 = getmysqlConnection(); 结果集 rs = null; 语句 stmt = null; 尝试 conn = getMySqlConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 结果集.CONCUR_UPDATABLE); conn.setAutoCommit(false); stmt.addBatch("插入调查(id, name) VALUES('11', 'Alex')"); stmt.addBatch("插入调查(id, name) VALUES('22', 'Mary')"); stmt.addBatch("插入调查(id, name) VALUES('33', 'Bob')"); int[] updateCounts = stmt.executeBatch(); System.out.println(updateCounts); conn.commit(); rs = stmt.executeQuery("SELECT * FROM 调查"); 而(rs.next()) 字符串 id = rs.getString("id"); 字符串名称 = rs.getString("name"); System.out.println("id="+id +" name="+name); 捕捉(BatchUpdateException b) System.err.println("SQLException:" + b.getMessage()); System.err.println("SQLState:" + b.getSQLState()); System.err.println("消息:" + b.getMessage()); System.err.println("供应商错误代码:" + b.getErrorCode()); System.err.print("更新次数:"); int [] updateCounts = b.getUpdateCounts(); for (int i = 0; i

【问题讨论】:

【参考方案1】:

您有一个您感兴趣的 ID 列表。您可以使用 'id in (...,...,)' 约束:

StringBuilder newIds = new StringBuilder();
ResultSet rs = stmt.getGeneratedKeys();
while (rs.next()) 
  if (newIds.length() > 0)  newIds.append(',');
  newIds.append(rs.getInt(1));


if (newIds.length() > ) 
  rs = stmt.executeQuery("SELECT * FROM survey where id in ("+newIds+")");
  ...

【讨论】:

以上是关于jdbc 有效地获取生成的密钥以及其他数据的主要内容,如果未能解决你的问题,请参考以下文章

Sybase JDBC 获取生成的密钥

如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?

使用 jdbctemplate / jdbc for Hana db 获取序列生成的主键

javaWeb_JDBC_JDBC获取数据库自动生成的主键值

Python numpy:为3个其他列的每个唯一元组有效地获取包含min值的行

jdbc 批量插入和查询与使用生成键的单次插入