2012-04-09 17 views
33

Ho lavorato sia mappatore riga e chiamata estrattore di risultati indietro interfaces.I pensa differenza cioèqual è la differenza tra ResultSetExtractor vs Rowmapper?

1.Row mappatore può essere elaborazione per row basis.But Resultset estrattore possiamo naviagte tutte le righe e restituire tipo è oggetto.

C'è qualche differenza oltre che sopra? .Come funziona Rowmapper interno e il tipo di ritorno è l'elenco ?.

+1

A mio parere, RowMapper è molto più semplice e probabilmente finirà per usarlo piuttosto che ResultSetExtractor. Per ulteriori informazioni, consultare [JavaDoc] (http://static.springsource.org/spring/docs/3.0.0.RC1/javadoc-api/) e la [Documentazione] (http: //static.springsource. org/spring/docs/2.5.x/reference/jdbc.html) – Zack

risposta

22

JavaDoc of ResultSetExtractor:

Questa interfaccia è utilizzata principalmente nell'ambito JDBC stessa. Un RowMapper di solito è una scelta più semplice per l'elaborazione ResultSet, mappando un oggetto risultato per riga anziché un oggetto risultato per l'intero ResultSet.

ResultSetExtractor è supponiamo per estrarre tutta ResultSet (possibilmente più righe), mentre RowMapper è alimentato con riga alla volta.

Vedi anche

+7

ResultSetExtractor utilizza al di fuori del framework, ad esempio è utile per mappare uno a molti utilizzando una singola istruzione SQL, ad esempio un Dipendente con un set di festività . –

31

differenza di base è con ResultsetExtractor è necessario scorrere il set di risultati da soli, dicono nel ciclo while. Questa interfaccia fornisce l'elaborazione dell'intero ResultSet in una sola volta. L'implementazione del metodo Interface extractData (ResultSet rs) conterrà quel codice di iterazione manuale.

mentre alcuni gestori di callback come RowCallbackHandler, il metodo di interfaccia processRow (ResultSet rs) loop per te.

RowMapper può essere utilizzato sia per il mapping di ogni riga, sia per l'intera riga.

Per intere righe Oggetto (metodo template jdbcTemplate.query())

public List findAll() {  
    String sql = "SELECT * FROM EMPLOYEE"; 
    return jdbcTemplate.query(sql, new EmployeeRowMapper()); 
} 
without casting will work 

per oggetto individuale (con metodo Template 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; 
} 

}

Best Use cases:

Mappatore riga: Quando ogni riga di un ResultSet si associa a un oggetto dominio, può essere implementata come classe interna privata.

RowCallbackHandler: Quando nessun valore viene restituito dal metodo di callback per ogni riga, ad es. scrivere una riga su un file, convertire le righe in un XML, Filtrare le righe prima di aggiungere alla raccolta. Molto efficiente come ResultSet alla mappatura degli oggetti non è fatto qui.

ResultSetExtractor: Quando più righe di ResultSet si associano a un singolo oggetto.Come quando si eseguono join complessi in una query, potrebbe essere necessario avere accesso all'intero ResultSet invece della singola riga di rs per creare oggetti complessi e si desidera assumere il controllo completo di ResultSet. Come mappare le righe restituite dal join di TABLE1 e TABLE2 a un aggregato TABLE completamente ricostituito.

ParameterizedRowMapper viene usato per creare oggetti complessi

+0

Ben spiegato. – phoenixSid

0

Credo un posto in cui una RowSetExtractor potrebbe essere vantaggioso è quando si ha un set di risultati (come da una chiamata a una procedura immagazzinata) e un mappatore fila, e vuoi processarli come è fatto sotto le copertine nei metodi jdbcTemplate, come query (String sql, RowMapper rowMapper). In questo caso è possibile evitare di dover eseguire manualmente l'iterazione sul set di risultati utilizzando RowSetExtractor anziché solo RowMapper.

Ad esempio:

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: Per elaborare un record di ResultSet alla volta.

ResultSetExtractor: per elaborare più record di ResultSet alla volta.

+0

Dovrebbe essere aggiunto come commento. – arqam

Problemi correlati