refactor: 提取 ResultHandler.mapToList 消除 ResultSet 遍历重复代码

This commit is contained in:
2026-06-05 20:28:16 +08:00
parent f323d04d57
commit 3753aafd61
2 changed files with 27 additions and 18 deletions

View File

@@ -37,8 +37,6 @@ import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.collect.Lists;
/**
* JdbcOperationSupport
*
@@ -184,18 +182,13 @@ class JdbcOperationSupport {
assertConnectionNotNull(conn);
assertSqlNotNull(sql);
assertRowMapperNotNull(rowMapper);
final List<T> result = Lists.newArrayListWithCapacity(4);
try (PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
fillStatement(stmt, params);
stmt.executeUpdate();
try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
int rowNumber = 0;
while (generatedKeys.next()) {
T e = rowMapper.mapRow(generatedKeys, rowNumber++);
result.add(e);
}
final ResultHandler<List<T>> resultHandler = ResultHandler.mapToList(rowMapper);
return resultHandler.handle(generatedKeys);
}
return result;
}
}
@@ -324,15 +317,7 @@ class JdbcOperationSupport {
@Nullable Object[] params,
@Nonnull RowMapper<T> rowMapper)
throws SQLException {
return queryInternal(conn, sql, params, rs -> {
List<T> result = Lists.newArrayList();
int rowNumber = 0;
while (rs.next()) {
T e = rowMapper.mapRow(rs, rowNumber++);
result.add(e);
}
return result;
});
return queryInternal(conn, sql, params, ResultHandler.mapToList(rowMapper));
}
/**

View File

@@ -18,6 +18,8 @@ package xyz.zhouxy.jdbc;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* ResultHandler
@@ -41,4 +43,26 @@ public interface ResultHandler<T> {
* @throws SQLException 数据库执行异常
*/
T handle(ResultSet resultSet) throws SQLException;
/**
* 创建一个返回 {@link List} 的 {@link ResultHandler},将 {@link ResultSet} 中的每一行
* 通过指定的 {@link RowMapper} 映射为对象,最终收集为一个 {@link List}。
*
* @param <T> 列表元素类型
* @param rowMapper 行映射器,用于将 {@link ResultSet} 的单行转换为对象
* @return 返回 {@code List<T>} 的 {@code ResultHandler}
* @since 1.0.0
* @see RowMapper
*/
static <T> ResultHandler<List<T>> mapToList(RowMapper<T> rowMapper) {
return resultSet -> {
List<T> result = new ArrayList<>();
int rowNumber = 0;
while (resultSet.next()) {
T e = rowMapper.mapRow(resultSet, rowNumber++);
result.add(e);
}
return result;
};
}
}