2012-08-15 139 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时会关闭自动提交。