Spring中getJdbcTemplate()批量SQL实现
//应用场景:
如以下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 }