2015-04-04 74 views
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外鍵,則不能插入子對象。

我在其他地方搜索了答案,找不到任何解決方法。我讀了一些關於使用存儲過程的內容(如果可能,我希望避免這種情況)。效率在這裏很重要,因爲我正在處理數百萬條記錄。我很欣賞任何人可能有的見解。

+0

執行'executeBatch'之後,您可以獲取生成的密鑰,請參閱[這裏](http://stackoverflow.com/q/4952316/3080094)。因此,首先在批處理中插入父記錄,獲取parent_ids,然後在批處理中插入子記錄。 – vanOekel 2015-04-04 22:28:42

回答

0

不要以爲生成的主鍵是可能的。如果您的應用程序只是數據庫的一個客戶端,那麼您可以自己計算主鍵並直接在準備好的語句中傳遞它們。