Подтвердить что ты не робот

В чем разница между ResultSetExtractor и Rowmapper?

Я работал как с интерфейсами обратного вызова, так и с обработчиком строк. Я нашел разницу i.e.,

1. Преобразователь может обрабатываться на основе строки. Но вы можете извлечь все строки, а возвращаемый тип - объект.

Есть ли какая-либо разница, отличная от приведенной выше?. Как работают внутренние и возвращаемые типы Rowmapper - это список?.

4b9b3361

Ответ 1

JavaDoc ResultSetExtractor:

Этот интерфейс в основном используется в самой структуре JDBC. RowMapper обычно является более простым выбором для обработки ResultSet, отображая один результирующий объект на строку вместо одного результирующего объекта для всего ResultSet.

ResultSetExtractor должен извлекать весь ResultSet (возможно, из нескольких строк), в то время как RowMapper заполняется строкой за раз.

В большинстве случаев ResultSetExtractor будет зацикливать ResultSet и использовать RowMapper, пример фрагмента Spring RowMapperResultSetExtractor:

List<T> results = (this.rowsExpected > 0 ? new ArrayList<T>(this.rowsExpected) : new ArrayList<T>());
int rowNum = 0;
while (rs.next()) {
    results.add(this.rowMapper.mapRow(rs, rowNum++));
}
return results;

Обратите внимание, что ВСЕ результаты будут преобразованы, это может создать исключение Out Of Memory.

Смотрите также

Ответ 2

Основное отличие от ResultsetExtractor - вам нужно выполнить итерацию результата результата, скажем, в цикле while. Этот интерфейс предоставляет вам обработку всего ResultSet сразу. Выполнение метода интерфейса extractData (ResultSet rs) будет содержать этот ручной итерационный код. См. одну реализацию ResultsetExtractor

в то время как некоторые обработчики обратного вызова, такие как RowCallbackHandler, обращаются к методу processRow (ResultSet rs) для интерфейса.

RowMapper может использоваться как для отображения каждой строки, так и целых строк.

Для целых строк Object (методом шаблона 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;
}

}

Наилучшие варианты использования:

Row Mapper: Когда каждая строка ResultSet сопоставляется с объектом Object, может быть реализована как закрытый внутренний класс.

RowCallbackHandler: Если значение возвращаемого значения не возвращается из метода обратного вызова для каждой строки, например. запись строки в файл, преобразование строк в XML, фильтрация строк перед добавлением в коллекцию. Очень эффективно, поскольку отображение ResultSet для Object здесь не выполняется.

ResultSetExtractor:. Когда несколько строк ResultSet сопоставляются с одним объектом. Например, при выполнении сложных объединений в запросе может потребоваться доступ к целому ResultSet вместо одной строки rs для создания сложного объекта, и вы хотите полностью контролировать ResultSet. Как и сопоставление строк, возвращаемых из объединения таблиц TABLE1 и TABLE2, в полностью восстановленный агрегат TABLE.

ParameterizedRowMapper используется для создания сложных объектов

Ответ 3

RowMapper: для обработки одной записи ResultSet за один раз.

ResultSetExtractor: для обработки нескольких записей ResultSet одновременно.

Ответ 4

Я думаю, что одно из мест, где ResultSetExtractor может быть выгодным, - это когда у вас есть набор результатов (например, от вызова хранимой процедуры) и преобразователь строк, и вы хотите обрабатывать их так, как это делается под покровом в методах jdbcTemplate, таких как запрос (String sql, RowMapper rowMapper). В этом случае вы можете избавить себя от необходимости вручную перебирать набор результатов, используя ResultSetExtractor вместо RowMapper.

Например:

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);