Hint
This article is generated by AI translation.
ResultSetExtractor
ResultSetExtractor provides full control over the ResultSet, suitable for scenarios that require custom traversal logic (such as converting to Map, aggregation statistics, etc.).
Unlike RowMapper which is called per row, ResultSetExtractor takes over the entire ResultSet directly.
Interface Definition
@FunctionalInterface
public interface ResultSetExtractor<T> {
T extractData(ResultSet rs) throws SQLException;
}
Custom Implementation Example
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;
}
}
How to Use
Example: Programmatic API
// Use query() method; return value is determined by the Extractor generic type
Map<Integer, String> result = jdbc.query("select * from users", userExtractor);
// With arguments
Map<Integer, String> result = jdbc.query("select * from users where age > ?", 18, userExtractor);
Example: Declarative API
@SimpleMapper
public interface UserMapper {
@Query(value = "select * from users where id > #{id}",
resultSetExtractor = UserResultSetExtractor.class)
Map<Integer, String> listUsers(@Param("id") long searchId);
}
Example: Fluent API
// Use query() method (not queryForList)
Map<Integer, String> result = lambda.query(User.class)
.le(User::getId, 100)
.query(userExtractor);
Example: Mapper File
<select id="queryListByAge" resultSetExtractor="com.example.dto.UserResultSetExtractor">
select * from users where age = #{age}
</select>
Note
ResultSetExtractor uses the query() method, not queryForList(). queryForList() is for RowMapper.
Built-ins
dbVisitor ships with 9 built-in ResultSetExtractor implementations:
Object-mapping based
- BeanMappingResultSetExtractor — Uses ORM mapping information to convert the result set to
List<Bean>, equivalent toBeanMappingRowMapper. - MapMappingResultSetExtractor — Uses ORM mapping information to convert the result set to
List<Map>, equivalent toMapMappingRowMapper.
Based on query results
- ColumnMapResultSetExtractor — Converts each row to
Map<String, Object>, collected asList<Map>, equivalent toColumnMapRowMapper. - PairsResultSetExtractor — Uses the first two columns of each row as key-value pairs, collected as
Map<K, V>. Key and value types are converted via TypeHandler.
PairsResultSetExtractor Example
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);
// Result: {1="mali", 2="dative", 3="jon wes"}
Handling multiple result sets
- CallableMultipleResultSetExtractor — Handles all data returned by
CallableStatement(OUT parameters, result sets, multiple execution results). - PreparedMultipleResultSetExtractor — Handles multiple result sets returned by
PreparedStatement.
Wrapping existing row handlers
- RowMapperResultSetExtractor — Adapts a RowMapper to a ResultSetExtractor, returning
List<T>. - FilterResultSetExtractor — Extends RowMapperResultSetExtractor with a
Predicatefilter. - RowCallbackHandlerResultSetExtractor — Adapts a RowCallbackHandler to a ResultSetExtractor.
FilterResultSetExtractor Example
ResultSetExtractor<List<User>> extractor =
new FilterResultSetExtractor<>(userRowMapper, user -> user.getAge() > 24);
List<User> result = jdbc.query("select * from users", extractor);