我使用JDBC的executeBatch()
来插入多行数据,我想要获取插入行的id以供另外一次插入使用。我使用以下代码实现这个目的:
insertInternalStatement = dbConncetion.prepareStatement(INSERT_RECORD, generatedColumns);
for (Foo foo: foosHashSet) {
insertInternalStatement.setInt(1, foo.getMe());
insertInternalStatement.setInt(1, foo.getMe2());
// ..
insertInternalStatement.addBatch();
}
insertInternalStatement.executeBatch();
// now get inserted ids
try (ResultSet generatedKeys = insertInternalStatement.getGeneratedKeys()) {
Iterator<Foo> fooIterator= foosHashSet.iterator();
while (generatedKeys.next() && fooIterator.hasNext()) {
fooIterator.next().setId(generatedKeys.getLong(1));
}
}
它能正常工作并返回id,我的问题是:
如果我遍历
getGeneratedKeys()
和foosHashSet
,那么id会以相同的顺序返回,使得每个从数据库返回的id都属于相应的Foo实例吗?当我使用多线程时,上述代码在多个线程中同时运行会怎样?
还有其他解决方案吗?我有两个表foo1和foo2,我想先插入foo1记录,然后将它们的主键作为foo2外键使用。