public int[] batchUpdate(final PreparedStatementCreator psc, final BatchPreparedStatementSetter pss, final KeyHolder generatedKeyHolder) throws DataAccessException {
public <T> int[][] batchUpdate(String sql, final Collection<T> batchArgs, final int batchSize, final ParameterizedPreparedStatementSetter<T> pss) throws DataAccessException {
// 在调试模式下,记录 SQL 批量操作的执行情况和批次大小。
if (this.logger.isDebugEnabled()) {
this.logger.debug("Executing SQL batch update [" + sql + "] with a batch size of " + batchSize);
}
int[][] result = (int[][])this.execute(sql, (ps) -> {
ArrayList<int[]> rowsAffected = new ArrayList<>();
假设我们需要查询用户及其订单信息,并将这些信息构造成一个包罗用户和其订单列表的复杂对象。我们可以利用 ResultSetExtractor 实现这一需求。
首先,假设我们有如下的 User 和 Order 类:
public class User {
private Long id;
private String name;
private String email;
private Integer age;
private List<Order> orders;
// 构造方法、getter 和 setter 方法省略
}
public class Order {
private Long orderId;
private String product;
private BigDecimal price;
// 构造方法、getter 和 setter 方法省略
}
复制代码
然后,我们可以利用 ResultSetExtractor 将查询效果映射为一个 User 对象及其关联的 Order 列表:
public class UserWithOrdersExtractor implements ResultSetExtractor {
@Override
public User extractData(ResultSet rs) throws SQLException, DataAccessException {
User user = null;
List<Order> orders = new ArrayList<>();
while (rs.next()) {
if (user == null) {
user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
user.setAge(rs.getInt("age"));
}
Order order = new Order();
order.setOrderId(rs.getLong("order_id"));
order.setProduct(rs.getString("product"));
order.setPrice(rs.getBigDecimal("price"));
orders.add(order);
}
if (user != null) {
user.setOrders(orders);
}
return user;
}
}
复制代码
在这个实现中,我们利用 while 循环遍历 ResultSet,每次读取一行数据。在第一次循环时,我们初始化 User 对象,并在后续的每一行中将订单信息添加到用户的订单列表中。循环竣事后,返回包罗所有订单信息的用户对象。
利用匿名类或 Lambda 表达式简化 ResultSetExtractor