2013-02-05 114 views
1

我想使用preparedStatement Batch,但我遇到了问题。Java MySQL preparedStatement Batch

下面的代码不会给我错误,但它只在表格中插入最后一个键,我不知道为什么。

这将是肯定是一个非常愚蠢的错误,但是这是我第一次使用addBatch()方法..提前

 Class.forName("com.mysql.jdbc.Driver"); 
     this.connect = DriverManager.getConnection("jdbc:mysql://localhost/" + this.database + "?user=" + this.user + "&password=" + this.password); 
     String s; 
     for (String key : this.map.keySet()) 
     { 
      s = ("insert into " + this.database + ".user (nickname) values (?)"); 
      this.preparedStatement = this.connect.prepareStatement(s); 
      this.preparedStatement.setString(1, key); 
      this.preparedStatement.addBatch(); 
     } 

     this.preparedStatement.executeBatch(); 

谢谢!

+2

'connect'和'preparedStatement'没有很好的理由是成员变量。所有这些完成了引入线程不安全性,并为其他错误的范围。使它们成为局部变量。 – EJP

+0

@EJP是的,我从一个例子中得到了部分代码。当我对它更有信心时,我会纠正它。感谢您的建议! – Ikki

回答

6

准备好你的声明和查询的循环之外:

 s = ("insert into " + this.database + ".user (nickname) values (?)"); 
     this.preparedStatement = this.connect.prepareStatement(s); 
     for (String key : this.map.keySet()) 
     { 
      this.preparedStatement.setString(1, key); 
      this.preparedStatement.addBatch(); 
     } 
     this.preparedStatement.executeBatch(); 
+0

谢谢!现在它工作了!现在我会有另一个关于批处理的问题,我会再提出一个问题!请在几分钟内看看! :) – Ikki

3

您正在使用addBatch()方法是错误的。在您的代码中,您正在for循环的每次迭代中执行prepareStatement,并且每次都会替换准备好的查询。

你只应该每批次调用prepareStatement一次。您应该在循环之前放置准备好的语句(只有一个调用)