Skip to main content
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 to BeanMappingRowMapper.
  • MapMappingResultSetExtractor — Uses ORM mapping information to convert the result set to List<Map>, equivalent to MapMappingRowMapper.

Based on query results

  • ColumnMapResultSetExtractor — Converts each row to Map<String, Object>, collected as List<Map>, equivalent to ColumnMapRowMapper.
  • 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 Predicate filter.
  • 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);