2012-08-15 140 views
0

好吧,我會重寫這個問題,因爲我之前做了一些過於複雜的事情。java,mysql使用preparedStatement插入到多個表中

我想借此:

con.setAutoCommit(false); 
String tempforbatch; 
Statement stmt = con.createStatement(); 
for (int i = 0; i < tables.length; i++) { 
    tempforbatch = "INSERT INTO " + tables[i] + " VALUES ('" + values[i] + "')"; 
    stmt.addBatch(tempforbatch); 
} 
stmt.executeBatch(); 

,並把它變成的東西完全一樣,只是使用:

PreparedStatement stmt = con.prepareStatement("INSERT INTO table_name VALUES (?, ?)"); 

其中 '表名' 可以基於更換哪些表[I]每次都是通過循環。

我已經儘可能地嘗試了所有可能的方法,並且所有方法都是一樣的,要麼對sql無效,要麼每次只是最後一次INSERT都丟失。

最後,我想做一個循環,將批量所有插入,也許100,也許1000我不知道。在任何情況下,我希望它循環和批處理所有插入,然後執行一次所有的批處理。另一種方法是僅僅執行每一個單獨的插入,這首先破壞了具有批處理功能的原因。

如果只是有辦法做到這一點:

PreparedStatement stmt = con.prepareStatement("INSERT INTO ? VALUES (?, ?)"); 
...loop code here.... 
stmt.setTable(1, "table1"); 
stmt.setString(2, "value1"); 
stmt.setString(3, "value2"); 
stmt.addBatch(); 
...end loop here.... 
stmt.executeBatch(); 

但是大家都知道.setTable不存在:(如果有那麼它可以被放置到一個循環,並給予不同的表值對於循環中的每一個循環來說,這種類型的循環現在可以正常工作,只要將它全部提供給同一個表即可。

+0

我開始認爲現在我已經看到PreparedStatement的更多內容了。如果有辦法以'table_name'可變的方式調用它,那麼它可能會工作,例如s = conn.prepareStatement(「INSERT INTO?VALUES(?)」);然後有一些形式的s.setTable(1,「table1」);但沒有辦法做到這一點,我發現,並且每個批次的表格必須設置爲石頭。 – 2012-08-15 07:18:29

回答

0

通過其他示例(例如PreparedStatement.addBatch in java has any restrictions?)判斷,在製作時不能只使用一個調用executeBatch多次調用prepareStatement。每次調用prepareStatement,雖然可以有多次調用addBatch,但必須有自己的調用則ExecuteBatch。

因此,爲了儘量減少Java和MySQL之間的通信,我會考慮在MySQL中使用存儲過程。並且像往常一樣進行優化,在我斷定實際需要更復雜的方式(存儲過程)之前,我會試試它的簡單方法。

我還看到,其他人在使用e​​xecuteBatch時會關閉自動提交。