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 有效地获取生成的密钥以及其他数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?
使用 jdbctemplate / jdbc for Hana db 获取序列生成的主键
javaWeb_JDBC_JDBC获取数据库自动生成的主键值