1

I am trying to use the preparedStatement Batch but I am having a problem.

The following code does not give me errors, but it inserts in the table only last key of the map and I do not know why.

It will be surely a very stupid error, but this is the first time I use the addBatch() method..

        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();

Thanks in advance!

2
  • 2
    There's no good reason for 'connect' and 'preparedStatement' to be member variables. All that's accomplishing is introducing thread-unsafety, and scope for other errors. Make them local variables. Commented Feb 5, 2013 at 23:12
  • @EJP yes, I have taken part of code from an example.. I will correct it when I will be more confident with it. Thanks for the suggestion! Commented Feb 5, 2013 at 23:21

2 Answers 2

6

Prepare your Statement and query outside of the loop:

      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();
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! Now it works! Now i would have another question about batch process, I will open another question! Take a look in few minutes please! :)
3

You are using the addBatch() method wrong. In your code you are doing the prepareStatement in each iteration of for loop, and this replaces the prepared query each time.

You should only be calling prepareStatement once per batch. You should place the prepared statement before the loop (only one call)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.