ResultSetExtractor
ResultSetExtractor 接口提供对 ResultSet 的完全控制,适用于需要自定义遍历逻辑的场景(如转换为 Map、聚合统计等)。
与 RowMapper 每行调用不同,ResultSetExtractor 直接接管整个 ResultSet。
接口定义
@FunctionalInterface
public interface ResultSetExtractor<T> {
T extractData(ResultSet rs) throws SQLException;
}
自定义实现示例
public class UserResultSetExtractor implements ResultSetExtractor<Map<Integer, String>> {
public Map<Integer, String> extractData(ResultSet rs) throws SQLException {
Map<Integer, String> hashMap = new HashMap<>();
while (rs.next()) {
hashMap.put(rs.getInt("id"), rs.getString("name"));
}
return hashMap;
}
}
如何使用
例:编程式 API
// 使用 query() 方法,返回值由 Extractor 泛型决定
Map<Integer, String> result = jdbc.query("select * from users", userExtractor);
// 带参数
Map<Integer, String> result = jdbc.query("select * from users where age > ?", 18, userExtractor);
例:声明式 API
@SimpleMapper
public interface UserMapper {
@Query(value = "select * from users where id > #{id}",
resultSetExtractor = UserResultSetExtractor.class)
Map<Integer, String> listUsers(@Param("id") long searchId);
}
例:构造器 API
// 使用 query() 方法(非 queryForList)
Map<Integer, String> result = lambda.query(User.class)
.le(User::getId, 100)
.query(userExtractor);
例:在 Mapper File 中使用
<select id="queryListByAge" resultSetExtractor="com.example.dto.UserResultSetExtractor">
select * from users where age = #{age}
</select>
注意
ResultSetExtractor 使用 query() 方法而非 queryForList()。queryForList() 用于 RowMapper。
内置实现
dbVisitor 内置了 9 个 ResultSetExtractor 实现:
基于对象映射
- BeanMappingResultSetExtractor — 利用 ORM 映射信息将结果集转换为
List<Bean>,效用等同于BeanMappingRowMapper。 - MapMappingResultSetExtractor — 利用 ORM 映射信息将结果集转换为
List<Map>,效用等同于MapMappingRowMapper。
基于查询结果
- ColumnMapResultSetExtractor — 将每行转为
Map<String, Object>,收集为List<Map>,效用等同于ColumnMapRowMapper。 - PairsResultSetExtractor — 将每行的前两列作为键值对,收集为
Map<K, V>。键值类型通过 TypeHandler 转换。
PairsResultSetExtractor 示例
ResultSetExtractor<Map<Integer, String>> extractor =
new PairsResultSetExtractor<>(TypeHandlerRegistry.DEFAULT, Integer.class, String.class);
Map<Integer, String> result = jdbc.query("select id, name from users", extractor);
// 结果:{1="mali", 2="dative", 3="jon wes"}
处理多结果集
- CallableMultipleResultSetExtractor — 处理
CallableStatement返回的所有数据(出参、结果集、多执行结果)。 - PreparedMultipleResultSetExtractor — 处理
PreparedStatement返回的多结果集。
包裹已有行处理器
- RowMapperResultSetExtractor — 将 RowMapper 适配为 ResultSetExtractor,返回
List<T>。 - FilterResultSetExtractor — 在 RowMapperResultSetExtractor 基础上增加
Predicate过滤。 - RowCallbackHandlerResultSetExtractor — 将 RowCallbackHandler 适配为 ResultSetExtractor。
FilterResultSetExtractor 示例
ResultSetExtractor<List<User>> extractor =
new FilterResultSetExtractor<>(userRowMapper, user -> user.getAge() > 24);
List<User> result = jdbc.query("select * from users", extractor);