refactor: 提取 ResultHandler.mapToList 消除 ResultSet 遍历重复代码
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user