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는 복잡한 객체를 만드는 데 사용됩니다.
이 인터페이스는 주로 JDBC 프레임워크 자체 내에서 사용됩니다.RowMapper는 일반적으로 ResultSet 처리를 위해 전체 ResultSet에 대해 하나의 결과 개체 대신 행당 하나의 결과 개체를 매핑하는 더 간단한 선택입니다.
ResultSetExtractor
전체를 추출해야 합니다.ResultSet
(여러 행 포함), 동시에 한 번에 행과 함께 피드됩니다.
대부분의 경우,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;
모든 결과가 변환되므로 메모리 부족 예외가 발생할 수 있습니다.
참고 항목
RowMapper
한 번에 하나의 ResultSet 레코드를 처리합니다.
ResultSetExtractor
ResultSet의 여러 레코드를 한 번에 처리합니다.
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
'source' 카테고리의 다른 글
tnsnames.ora 파일이 없는 Oracle 연결 문자열 (0) | 2023.08.13 |
---|---|
Angular Event Emitter Error: 0개의 유형 인수가 필요하지만 1개를 받았습니다. (0) | 2023.08.13 |
두 숫자 사이에 UI 레이블 텍스트를 애니메이션화하시겠습니까? (0) | 2023.08.08 |
Excel VBA에서 사용자 정의 워크시트 함수 생성 (0) | 2023.08.08 |
텍스트 상자에서 "Enter" 키를 눌렀을 때 HTML 버튼을 트리거하려면 어떻게 해야 합니까? (0) | 2023.08.08 |