J'ai travaillé à la fois sur le mappeur de lignes et sur l'extracteur de résultats pour rappeler des interfaces.J'ai constaté une différence, c'est-à-dire
1.Le mappeur peut être traité par ligne. Extracteur de résultats, nous pouvons naviguer toutes les lignes et le type de retour est object.
Existe-t-il une différence autre que celle indiquée ci-dessus? .Comment fonctionne le type interne et de retour Rowmapper est list ?.
JavaDoc of ResultSetExtractor
:
Cette interface est principalement utilisée dans le cadre JDBC lui-même. Un RowMapper est généralement un choix plus simple pour le traitement de ResultSet, mappant un objet de résultat par ligne au lieu d'un objet de résultat pour l'ensemble de ResultSet.
ResultSetExtractor
est supposé extraire la totalité de la ResultSet
(éventuellement plusieurs lignes), tandis que RowMapper
est alimenté ligne par ligne.
La différence fondamentale est qu'avec ResultsetExtractor, vous aurez besoin de parcourir le jeu de résultats vous-même, par exemple, en boucle while . Cette interface vous permet de traiter l'ensemble du ResultSet en une fois. L'implémentation de la méthode Interface extractData (ResultSet rs) contiendra ce code d'itération manuel . Voir une implémentation de ResultsetExtractor
alors que certains gestionnaires de rappel tels que RowCallbackHandler, la méthode d’interface processRow (ResultSet rs) boucle en boucle pour vous.
RowMapper peut être utilisé à la fois pour mapper chaque ligne ou des lignes entières.
Pour des lignes entières Object (par la méthode de modèle jdbcTemplate.query ())
public List findAll() {
String sql = "SELECT * FROM EMPLOYEE";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
without casting will work
Pour un objet individuel (avec la méthode 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;
}
}
Meilleurs cas d'utilisation:
Row Mapper: Lorsque chaque ligne d'un ResultSet est mappée sur un objet de domaine, elle peut être implémentée en tant que classe interne privée.
RowCallbackHandler: Lorsqu'aucune valeur n'est renvoyée par la méthode de rappel pour chaque ligne, par ex. écrire des lignes dans un fichier, convertir des lignes en XML, filtrer des lignes avant de les ajouter à la collection. Très efficace car le mappage de ResultSet en objet n'est pas effectué ici.
ResultSetExtractor: Lorsque plusieurs lignes de ResultSet sont mappées sur un seul objet. Comme lors de jointures complexes dans une requête, il peut être nécessaire d’avoir accès à un ensemble de ResultSet au lieu d’une seule ligne pour créer un objet complexe et vous souhaitez prendre le contrôle total de ResultSet. Like Mappage des lignes renvoyées par les jointures de TABLE1 et TABLE2 sur un agrégat TABLE entièrement reconstitué.
ParameterizedRowMapper est utilisé pour créer des objets complexes
RowMapper
: Pour traiter un enregistrement de ResultSet à la fois.
ResultSetExtractor
: Pour traiter plusieurs enregistrements de ResultSet à la fois.
Je pense qu’un endroit où un ResultSetExtractor pourrait être avantageux est lorsque vous avez un ensemble de résultats (comme un appel à une procédure stockée) et un mappeur de lignes, et que vous souhaitez les traiter comme cela se fait sous les couvertures dans les méthodes jdbcTemplate, telles que requête (String sql, RowMapper rowMapper). Dans ce cas, vous pouvez éviter d'avoir à parcourir manuellement le jeu de résultats en utilisant ResultSetExtractor au lieu de RowMapper.
Par exemple:
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);