source

ResultSetExtractor와 Rowmapper의 차이점은 무엇입니까?

manysource 2023. 8. 8. 21:43

ResultSetExtractor와 Rowmapper의 차이점은 무엇입니까?

저는 행 매퍼와 결과 집합 추출기 콜백 인터페이스 모두에서 작업했습니다.저는 차이를 발견했습니다.

1.행 매퍼는 행 단위로 처리할 수 있습니다.그러나 Resultset 추출기는 모든 행을 탐색할 수 있으며 반환 유형은 object입니다.

위 이외에 다른 점이 있습니까?Rowmapper 내부 및 반환 유형이 목록인 작업은 어떻게 됩니까?

기본적인 차이점은 Resultset입니다.추출기는 루프하는 동안 결과 집합을 반복해야 합니다.이 인터페이스를 통해 전체 ResultSet을 한 번에 처리할 수 있습니다.인터페이스 메서드 extractData(ResultSets)를 구현하면 해당 수동 반복 코드가 포함됩니다.하나의 결과 집합 구현 보기추출기

RowCallbackHandler와 같은 일부 콜백 핸들러는 인터페이스 메서드 processRow(ResultSeters)를 루프합니다.

행 매퍼는 각 행을 매핑하거나 전체 행을 매핑하는 데 모두 사용할 수 있습니다.

전체 행에 대해 Object(템플릿 메서드 jdbcTemplate에 의해)query()

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

개별 개체의 경우(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;
}

}

최상의 사용 사례:

행 매퍼:ResultSet의 각 행이 도메인 개체에 매핑되는 경우 개인 내부 클래스로 구현될 수 있습니다.

RowCallbackHandler:각 행에 대한 콜백 방법에서 값이 반환되지 않는 경우(예: 행을 파일로 쓰기, 행을 XML로 변환, 컬렉션에 추가하기 전에 행 필터링).여기서는 ResultSet to Object 매핑이 수행되지 않기 때문에 매우 효율적입니다.

결과 집합 추출기:ResultSet의 여러 행이 단일 개체에 매핑되는 경우.쿼리에서 복잡한 조인을 수행할 때처럼 복잡한 개체를 빌드하려면 rs의 단일 행 대신 전체 ResultSet에 대한 액세스 권한이 필요할 수 있으며 ResultSet을 완전히 제어해야 합니다.TABLE1과 TABLE2의 결합에서 반환된 행을 완전히 재구성된 TABLE Aggregate에 매핑하는 것과 같습니다.

매개 변수화된 RowMapper는 복잡한 객체를 만드는 데 사용됩니다.

의 JavaDoc:

이 인터페이스는 주로 JDBC 프레임워크 자체 내에서 사용됩니다.RowMapper는 일반적으로 ResultSet 처리를 위해 전체 ResultSet에 대해 하나의 결과 개체 대신 행당 하나의 결과 개체를 매핑하는 더 간단한 선택입니다.

ResultSetExtractor 전체를 추출해야 합니다.ResultSet(여러 행 포함), 동시에 한 번에 행과 함께 피드됩니다.

대부분의 경우,ResultSetExtractor루프할 것입니다.ResultSet및 사용RowMapperSpring의 토막글 예시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;

모든 결과가 변환되므로 메모리 부족 예외가 발생할 수 있습니다.

참고 항목

RowMapper한 번에 하나의 ResultSet 레코드를 처리합니다.

ResultSetExtractorResultSet의 여러 레코드를 한 번에 처리합니다.

ResultSetExtractor가 유리할 수 있는 한 곳은 결과 집합(예: 호출에서 저장 프로시저로)과 행 매퍼가 있고 쿼리(String sql, RowMapper)와 같은 jdbcTemplate 메서드의 커버에서 수행된 것처럼 처리하려는 경우입니다.이 경우 RowMapper만 사용하는 대신 ResultSetExtractor를 사용하여 결과 집합에 대해 수동으로 반복할 필요가 없습니다.

예:

행 매퍼

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;

결과 집합 추출기

ResultSet resultSet = callableStatement.executeQuery();
return new RowMapperResultSetExtractor<>(new DateRowMapper()).extractData(resultSet);

언급URL : https://stackoverflow.com/questions/10074025/what-is-difference-between-resultsetextractor-vs-rowmapper