//应用场景:
如以下SQL :
String sql = "INSERT INTO to_order_return_info VALUES(seq_order_return_info.nextval,?,?,?,?,?,?)";
该语句为向to_order_return_info表中插入新记录
但如需要N条数据插入 正常的方案为 执行N次插入数据操作
jdbc 支持批量SQL 可以进行同数据批量操作 以及混合数据批量操作
Spring 对jdbc进行了封装 同样支持批量操作
以下为同数据(插入到统一个表中的数据) 批量操作:
需要用到batchUpdate();方法
和BatchPreparedStatementSetter接口
实现getBatchSize();以及setValues 方法
getBatchSize();返回批量条数 也就是执行多少次增删改操作;
setValues(PreparedStatement ps, int i)
该方法会自动通过i遍历List 取出相应的增删改数据
1 public int orderReturnOperate(final List<Order_Return_Info> orders)
2 throws BaseException {
3
4 try {
5 String[] orderNums = new String[orders.size()];
6 for (int j = 0; j < orderNums.length; j++) {
7 if (orders.get(j) != null) {
8 orderNums[j] = orders.get(j).getOrderNum();
9 } else {
10 log.info("orderNum为null!");
11 return -1;
12 }
13 }
14 updateOrderItemsStatus(orderNums, orders.get(0) != null ? orders
15 .get(0).getOrderStatus() : "2014");
16
17 String queryStatusSql = "SELECT f_status_name FROM to_order_status WHERE f_status_num = ?";
18 final String statusName = (String) this.getJdbcTemplate()
19 .queryForObject(queryStatusSql,
20 new Object[] { orders.get(0).getOrderStatus() },
21 String.class);
22 String sql = "INSERT INTO to_order_return_info VALUES(seq_order_return_info.nextval,?,?,?,?,?,?)";
23 //执行批量sql 处理多次插入操作
24 int[] count = this.getJdbcTemplate().batchUpdate(sql,
25 new BatchPreparedStatementSetter() {
26
27 @Override
28 //执行次数
29 public int getBatchSize() {
30 return orders.size();
31 }
32
33 @Override
34 //执行参数
35 public void setValues(PreparedStatement ps, int i)
36 throws SQLException {
37 ps.setString(1, orders.get(i).getOrderNum());
38 ps.setString(2, orders.get(i).getOrderStatus());
39 ps.setString(3, statusName);
40 ps.setString(4, orders.get(i).getOpId());
41 ps.setString(5, orders.get(i).getOpName());
42 ps.setString(6, orders.get(i).getConfirmTime());
43 }
44
45 });
46 } catch (Exception e) {
47 log.info(e.getMessage());
48 return -1;
49 }
50 return 1;
51 }