サーブレットでクエリをループしたときにロックタイムアウトが発生していたので、一度実行される長いクエリを作成することにしました。何のことはないが、必要に応じてそれを文字列に何回ループである(どのように多くのチェックボックスユーザー・チェック)し、その後に文を準備 - このコードは私のDAOであるループ内で文字列を単独で追加するときにSQLクエリにエラーが発生する
public void deactivateAccount(String[] userList) {
DBConnectionFactory myFactory = DBConnectionFactory.getInstance();
Connection con = myFactory.getConnection();
try {
con.setAutoCommit(false);
String combinedQueries = "";
for (int i =0; i<userList.length;i++) {
String query = "UPDATE users SET active='0' WHERE userID = ? ; ";
combinedQueries += query;
}
System.out.println(combinedQueries);
PreparedStatement p = con.prepareStatement(combinedQueries);
for (int i =0; i<userList.length;i++) {
int currentNum = i+1;
p.setInt(currentNum, Integer.parseInt(userList[i]));
System.out.println("current num is " + currentNum);
System.out.println("userlist value is " + Integer.parseInt(userList[i]));
}
p.execute();
} catch (SQLException ex) {
try {
con.rollback();
} catch (SQLException ex1) {
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex1);
}
Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
}
}
:ここ
はコードがあります別のループ(プリペアドステートメントのパラメータを設定)して実行します。
私はエラーを取得する:
Severe: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET active='0' WHERE userID = 1; UPDATE users SET active='0' WHERE ' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
が、私はこれを実行する前に、コードでクエリを印刷する表示されるものである:
Info: UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; UPDATE users SET active='0' WHERE userID = ?; (assuming 4 checkboxes were clicked)
方法は、私がリクエストから取得配列を受け入れ.getParameterValuesはサーブレットから取得します。
ありがとうございました!