我需要更新多个选定用户的数据(在子句中使用)

时间:2015-04-22 06:54:18

标签: java mysql

for (int i = 0; i < useridArr.length; i++) {
    DbUtil.executeUpdate(
              conn, Mysql.insert_announcement, 
              new Object[]{
                   useridArr[i], companyid, msg, announcerid, 0, 1, 
                   new java.util.Date().getTime()
              });
}

现在,我想避免这种循环,请告诉我我需要做什么?

1 个答案:

答案 0 :(得分:2)

现在,循环将为给定数组useridArr中的每个用户id执行一个insert语句。从您的问题中不清楚为什么需要更改此信息 我会假设你想提高表现。这样做的方法是使用批量插入而不是多次插入。

无论如何,你需要遍历用户id来初始化语句值,即使它将执行一次。

您可以在DbUtil中添加新帮助程序(添加异常处理并根据需要返回)

public class DbUtil {
   public static void executeBatchUpdate(Connection con, 
                                         String stmt
                                         List<Object[]> data) {
      PreparedStatement p = con.prepareStatement(stmt);
      for (Object[] rowData : data) {
         for (int i = 0; i < rowData.length; i++) {
            p.setObject(i+1, rowData[i]);
         }
         p.addBatch();
      }
      int[] results = p.executeBatch();
      // check results
      // handle exceptions
      // return something if needed
   }
}

在像

这样的循环中构建List<Object[]>
List<Object[]> data = new ArrayList<>(useridArr.length);
for (int i = 0; i < useridArr.length; i++) {
    data.add(new Object[]{
                   useridArr[i], companyid, msg, announcerid, 0, 1, 
                   new java.util.Date().getTime()
             });
}

您还可以使用更专业的批量插入方法,直接获取值,准备批处理并执行它,而无需构建行Object[]的中间列表。