在循环的每次迭代中都创建一个新的PreparedStatement。您需要对调用executeBatch的同一preparedStatement对象上的批处理执行进行排队。目前您只执行第1000个排队查询。
StringBuilder sql = new StringBuilder(
"UPDATE USERS SET\n"
);
sql.append("USER_TYPE=?,\n")
.append("FIRST_NAME=?,\n")
.append("LAST_NAME=?,\n")
.append("EMAIL_ADDRESS=?\n");
sql.append("WHERE USER_ID=?");
preparedStatement = connection.prepareStatement(sql.toString());
for (User user : updatedUsers) {
preparedStatement.setString(1, user.getUserTypeId());
preparedStatement.setString(2, user.getFirstName());
preparedStatement.setString(3, user.getLastName());
preparedStatement.setString(4, user.getEmailAddress());
preparedStatement.setString(5, user.getUserId());
preparedStatement.addBatch();
// Submit in batches of 1000
if (++count % batchSize == 0) {
rowsAffected += IntStream.of(preparedStatement.executeBatch()).sum();
preparedStatement.clearBatch();
}
}
要确定受影响的行(在SQLServer2005+中),可以在sql中使用OUTPUT子句使数据库返回受影响的行数据。
Article