spring - query - ¿Cuál es la diferencia entre ResultSetExtractor vs Rowmapper?
spring jdbctemplate mkyong (4)
Creo que un lugar donde un ResultSetExtractor podría ser ventajoso es cuando tienes un conjunto de resultados (como desde una llamada a un procedimiento almacenado) y un mapeador de filas, y quieres procesarlos como se hace debajo de las coberturas en los métodos jdbcTemplate, como consulta (String sql, RowMapper rowMapper). En este caso, puede evitar tener que iterar manualmente sobre el conjunto de resultados utilizando el ResultSetExtractor en lugar de solo RowMapper.
Por ejemplo:
RowMapper
ResultSet resultSet = cs.executeQuery();
int row = 0;
DateRowMapper dateRowMapper = new DateRowMapper();
List<String> dates = new ArrayList<>();
while (resultSet.next()) {
dates.add(dateRowMapper.mapRow(resultSet, ++row));
}
return dates;
ResultSetExtractor
ResultSet resultSet = callableStatement.executeQuery();
return new RowMapperResultSetExtractor<>(new DateRowMapper()).extractData(resultSet);
Trabajé tanto en el mapeador de filas como en las interfaces de devolución de llamada del extractor de resultados. Encontré la diferencia, es decir,
1. El mapeador de Rows se puede procesar por fila. Pero el extractor Resultset podemos cambiar todas las filas y devolver el tipo es el objeto.
¿Hay alguna diferencia además de la anterior? ¿Cómo está el listado de Rowmaper interno y el tipo de retorno?
La diferencia básica es con ResultsetExtractor necesitará iterar a través del conjunto de resultados usted mismo, digamos en while loop. Esta interfaz le proporciona el procesamiento de todo el ResultSet a la vez. La implementación del método de interfaz extractData (ResultSet rs) contendrá ese código de iteración manual. Ver una implementación de ResultsetExtractor
mientras que algunos manejadores de devolución de llamada como RowCallbackHandler, el método de interfaz processRow (ResultSet rs) lo hace por usted.
RowMapper se puede utilizar tanto para mapear cada fila, o filas enteras.
Para filas enteras Object (por el método de la plantilla jdbcTemplate.query ())
public List findAll() {
String sql = "SELECT * FROM EMPLOYEE";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
without casting will work
Para objeto individual (con el método de Plantilla jdbcTemplate.queryForObject ())
@SuppressWarnings({ "unchecked", "rawtypes" })
public Employee findById(int id) {
String sql = "SELECT * FROM EMPLOYEE WHERE ID = ?";
// jdbcTemplate = new JdbcTemplate(dataSource);
Employee employee = (Employee) jdbcTemplate.queryForObject(sql, new EmployeeRowMapper(), id );
// Method 2 very easy
// Employee employee = (Employee) jdbcTemplate.queryForObject(sql, new Object[] { id }, new BeanPropertyRowMapper(Employee.class));
return employee;
}
@SuppressWarnings("rawtypes")
public class EmployeeRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("ID"));
employee.setName(rs.getString("NAME"));
employee.setAge(rs.getInt("AGE"));
return employee;
}
}
Mejores casos de uso:
Row Mapper: cuando cada fila de un ResultSet se asigna a un objeto de dominio, se puede implementar como clase interna privada.
RowCallbackHandler: cuando no se devuelve ningún valor del método de devolución de llamada para cada fila, por ejemplo, escribir una fila en un archivo, convertir filas en un XML, Filtrar filas antes de agregar a la colección. Muy eficiente como el mapeo ResultSet to Object no se hace aquí.
ResultSetExtractor: cuando varias filas de ResultSet se asignan a un solo objeto. Al igual que cuando se realizan combinaciones complejas en una consulta, es posible que se necesite tener acceso a ResultSet completo en lugar de una sola fila de rs para compilar Object complejo y se desea tener el control total de ResultSet. Me gusta Asignar las filas devueltas desde la combinación de TABLE1 y TABLE2 a un agregado de TABLE totalmente reconstituido.
ParameterizedRowMapper se utiliza para crear objetos complejos
JavaDoc de ResultSetExtractor
:
Esta interfaz se usa principalmente dentro del propio marco JDBC. Un RowMapper suele ser una opción más simple para el proceso de ResultSet, asignando un objeto de resultado por fila en lugar de un objeto de resultado para todo el ResultSet.
Se supone que ResultSetExtractor
extrae todo el ResultSet
(posiblemente múltiples filas), mientras que RowMapper
se alimenta con fila a la vez.
Ver también
RowMapper
: para procesar un registro de ResultSet a la vez.
ResultSetExtractor
: para procesar múltiples registros de ResultSet a la vez.