2012-04-09 58 views
33

trabajé en tanto fila mapeador de llamada y extractora de resultados posterior interfaces.I encontraron diferencias es decir,¿cuál es la diferencia entre ResultSetExtractor vs Rowmapper?

1.Row asignador puede ser procesado por fila extractora basis.But conjunto de resultados podemos naviagte todas las filas y volver tipo es objeto.

¿Hay alguna diferencia además de la anterior? .¿Cómo funciona Rowmapper interno y el tipo de retorno de la lista?

+1

En mi opinión, RowMapper es mucho más simple y probablemente terminará utilizándolo en lugar de ResultSetExtractor. Pero para obtener más información, consulte el [JavaDoc] (http://static.springsource.org/spring/docs/3.0.0.RC1/javadoc-api/) y la [Documentación] (http: //static.springsource. org/spring/docs/2.5.x/reference/jdbc.html) – Zack

Respuesta

22

JavaDoc of ResultSetExtractor:

Esta interfaz se utiliza principalmente en el marco JDBC sí mismo. 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.

ResultSetExtractor se supone que debe extraer los enteros ResultSet (posiblemente varias filas), mientras que RowMapper está alimentado con la fila a la vez.

Ver también

+7

ResultSetExtractor tiene usos fuera del marco, por ejemplo, es útil para mapear uno a muchos usando una sola instrucción SQL, por ejemplo, un empleado con un conjunto de días festivos. . –

31

diferencia básica es con ResultsetExtractor tendrá que recorrer el conjunto de resultados a sí mismo, por ejemplo en el bucle while. 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. See one implementation of ResultsetExtractor

mientras que algunos manejadores de devolución de llamada como RowCallbackHandler, la processRow método de interfaz (ResultSet rs) Bisagras para usted.

RowMapper se puede utilizar para mapear cada fila o filas enteras.

Para filas enteras de objeto (por el método de 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 método 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:

Asignador de filas: Cuando cada fila de un ResultSet se asigna a un objeto de dominio, puede implementarse como clase interna privada.

RowCallbackHandler: Cuando no se devuelve ningún valor del método de devolución de llamada para cada fila, p. escribiendo una fila en un archivo, convirtiendo filas en un XML, Filtrando 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

+0

Bien explicado. – phoenixSid

0

Creo que un lugar donde un RowSetExtractor podría ser ventajoso es cuando se tiene un conjunto de resultados (como de una llamada a un procedimiento almacenado) y un mapeador fila, y desea procesarlos como se hace debajo de las cubiertas en los métodos jdbcTemplate, como query (String sql, RowMapper rowMapper). En este caso, puede evitar tener que iterar manualmente sobre el conjunto de resultados utilizando RowSetExtractor 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); 
0

RowMapper: Para procesar un registro del conjunto de resultados a la vez.

ResultSetExtractor: Para procesar registros múltiples de ResultSet a la vez.

+0

Debe agregarse como un comentario en su lugar. – arqam

Cuestiones relacionadas