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

Я работал как над интерфейсами обратного вызова сопоставителя строк, так и над набором результатов. Я нашел разницу, т.е.

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

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


person user1127214    schedule 09.04.2012    source источник
comment
На мой взгляд, RowMapper намного проще, и вы, вероятно, в конечном итоге будете использовать его, а не ResultSetExtractor. Но для получения дополнительной информации ознакомьтесь с JavaDoc и документация   -  person Zack    schedule 09.04.2012


Ответы (4)


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.

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

person Tomasz Nurkiewicz    schedule 09.04.2012
comment
ResultSetExtractor используется вне рамок, например, он полезен для сопоставления одного со многими с помощью одного оператора SQL, например, сотрудника с набором праздников. - person Jasper Blues; 31.03.2015
comment
Но RowMapper и ResultSetExtractor можно использовать для получения списка записей?? - person susan097; 30.05.2018

Основное отличие заключается в том, что с 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
comment
Красиво объяснил. - person phoenixSid; 18.01.2018

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

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

person PRAKASH KUMAR BEHERA    schedule 07.02.2018
comment
Вместо этого следует добавить в качестве комментария. - person arqam; 07.02.2018

Я думаю, что одно из мест, где ResultSetExtractor может быть полезным, — это когда у вас есть набор результатов (например, из вызова хранимой процедуры) и средство сопоставления строк, и вы хотите обработать их, как это делается скрыто в методах jdbcTemplate, таких как запрос (строка 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);
person MMW    schedule 27.07.2017