Основное отличие заключается в том, что с ResultsetExtractor вам нужно будет самостоятельно перебирать набор результатов, скажем, в цикле while. Этот интерфейс обеспечивает обработку всего ResultSet сразу. Реализация метода интерфейса extractData(ResultSet rs) будет содержать этот код ручной итерации. Ознакомьтесь с одной реализацией ResultsetExtractor
в то время как некоторые обработчики обратного вызова, такие как RowCallbackHandler, зацикливают метод интерфейса processRow(ResultSet rs).
RowMapper можно использовать как для сопоставления каждой строки, так и целых строк.
Для всего объекта строк (методом шаблона jdbcTemplate.query())
public List findAll() {
String sql = "SELECT * FROM EMPLOYEE";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
without casting will work
Для отдельного объекта (с методом шаблона 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;
}
}
Лучшие варианты использования:
Сопоставитель строк: когда каждая строка ResultSet сопоставляется с объектом домена, может быть реализована как частный внутренний класс.
RowCallbackHandler: когда метод обратного вызова не возвращает никакого значения для каждой строки, например. запись строки в файл, преобразование строк в XML, фильтрация строк перед добавлением в коллекцию. Очень эффективно, так как сопоставление ResultSet с Object здесь не выполняется.
ResultSetExtractor: когда несколько строк ResultSet сопоставляются с одним объектом. Например, при выполнении сложных соединений в запросе может потребоваться доступ ко всему ResultSet вместо одной строки rs для создания сложного объекта, и вы хотите получить полный контроль над ResultSet. Подобно отображению строк, возвращенных из объединения TABLE1 и TABLE2, в полностью воссозданный агрегат TABLE.
ParameterizedRowMapper используется для создания сложных объектов.
person
vimal krishna
schedule
08.01.2015