Hiện tại, MySQL không cho phép đặt nhiều giá trị trong một cuộc gọi phương thức. Vì vậy, bạn phải có nó dưới sự kiểm soát của riêng bạn. Tôi thường tạo một câu lệnh chuẩn bị cho số tham số được xác định trước, sau đó tôi thêm nhiều lô theo ý tôi.
int paramSizeInClause = 10; // required to be greater than 0!
String color = "FF0000"; // red
String name = "Nathan";
Date now = new Date();
String[] ids = "15,21,45,48,77,145,158,321,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,358,1284,1587".split(",");
// Build sql query
StringBuilder sql = new StringBuilder();
sql.append("UPDATE book SET color=? update_by=?, update_date=? WHERE book_id in (");
// number of max params in IN clause can be modified
// to get most efficient combination of number of batches
// and number of parameters in each batch
for (int n = 0; n < paramSizeInClause; n++) {
sql.append("?,");
}
if (sql.length() > 0) {
sql.deleteCharAt(sql.lastIndexOf(","));
}
sql.append(")");
PreparedStatement pstm = null;
try {
pstm = connection.prepareStatement(sql.toString());
int totalIdsToProcess = ids.length;
int batchLoops = totalIdsToProcess/paramSizeInClause + (totalIdsToProcess % paramSizeInClause > 0 ? 1 : 0);
for (int l = 0; l < batchLoops; l++) {
int i = 1;
pstm.setString(i++, color);
pstm.setString(i++, name);
pstm.setTimestamp(i++, new Timestamp(now.getTime()));
for (int count = 0; count < paramSizeInClause; count++) {
int param = (l * paramSizeInClause + count);
if (param < totalIdsToProcess) {
pstm.setString(i++, ids[param]);
} else {
pstm.setNull(i++, Types.VARCHAR);
}
}
pstm.addBatch();
}
} catch (SQLException e) {
} finally {
//close statement(s)
}
Nếu bạn không muốn đặt NULL khi không còn tham số, bạn có thể sửa đổi mã để tạo hai truy vấn và hai câu lệnh chuẩn bị. Đầu tiên là như nhau, nhưng câu thứ hai cho phần còn lại (modulus). Trong ví dụ cụ thể này sẽ là một truy vấn cho 10 thông số và một cho 8 thông số. Bạn sẽ phải thêm 3 đợt cho truy vấn đầu tiên (30 tham số đầu tiên), sau đó một lô cho truy vấn thứ hai (8 thông số).
lô của giá trị nhân bản: http://stackoverflow.com/questions/2861230/what-is-the-best-approach-using-jdbc-for-parameterizing-an-in- khoản, http://stackoverflow.com/questions/2510083/preparedstatement-question-in-java-against-oracle và http://stackoverflow.com/questions/178479/alternatives-for-java-sql-preparedstatement-in- khoản-vấn đề – BalusC