0
我有一個Java應用程序,我正在嘗試對MySQL數據庫進行一系列批量插入。但是,我的許多表都是通過外鍵鏈接的。所以我不知道使用外鍵的價值,因爲它們是在上一批中生成的。Java PreparedStatement多個批量插入外鍵
例如採取這兩個表:
父
ID
名
孩子
ID
PARENT_ID (需要外鍵parent.id)
名稱
我知道如何導入這些不使用批次:
//already initialized variables: Connection connection, List<ParentObject> parentObjects
ResultSet rs = null;
PreparedStatement psParent = null;
PreparedStatement psChild = null;
for(ParentObject parent: parentObjects){
psParent = connection.prepareStatement("INSERT INTO product (name) VALUES (?)", PreparedStatement.RETURN_GENERATED_KEYS);
psParent.setString(1, parent.getName());
psParent.executeUpdate();
int parentId = 0;
rs = psParent.getGeneratedKeys();
if (rs.next())
parentId = rs.getInt(1);
rs.close();
psParent.close();
for(ChildObject child : parent.getChildren()){
psChild = connection.prepareStatement("INSERT INTO child (parent_id, name) VALUES (?,?)");
psChild.setInt(1, parentId);
psChild.setString(2, child.getName());
psChild.executeUpdate();
psChild.close();
}
}
現在我嘗試使用批處理:
PreparedStatement psParent = connection.prepareStatement("INSERT INTO product (name) VALUES (?)");
PreparedStatement psChild = connection.prepareStatement("INSERT INTO child (parent_id, name) VALUES (?,?)");
for(ParentObject parent: parentObjects){
psParent.setString(1, parent.getName());
psParent.addBatch();
for(ChildObject child : parent.getChildren()){
psChild.setInt(1, I_DONT_KNOW_HOW_TO_GET_THIS_ID_WHICH_HASNT_BEEN_INSERTED_YET);
psChild.setString(2, parent.getName());
psChild.addBatch();
}
}
psParent.executeBatch();
psParent.close();
psChild.executeBatch();
psChild.close();
我使用的實際數據結構要複雜得多比我上面提到的要多,但它說明了基本問題。我將如何使用批次完成上述操作?我遇到的問題是,如果不先知道要使用的parent_id外鍵,則不能插入子對象。
我在其他地方搜索了答案,找不到任何解決方法。我讀了一些關於使用存儲過程的內容(如果可能,我希望避免這種情況)。效率在這裏很重要,因爲我正在處理數百萬條記錄。我很欣賞任何人可能有的見解。
執行'executeBatch'之後,您可以獲取生成的密鑰,請參閱[這裏](http://stackoverflow.com/q/4952316/3080094)。因此,首先在批處理中插入父記錄,獲取parent_ids,然後在批處理中插入子記錄。 – vanOekel 2015-04-04 22:28:42