[SPRING] ResultSetExtractor와 Rowmapper의 차이점은 무엇입니까?
SPRINGResultSetExtractor와 Rowmapper의 차이점은 무엇입니까?
나는 행 매퍼와 결과 추출기 콜백 인터페이스에서 작업했습니다. 차이점을 발견했습니다. 즉,
1.Row mapper는 행 단위로 처리 할 수 있습니다. 그러나 Resultset 추출기는 모든 행을 탐색하고 반환 유형은 객체입니다.
위와 다른 점이 있습니까? Rowmapper 내부 및 반환 유형이 어떻게 작동하나요?.
해결법
-
==============================
1.ResultSetExtractor의 JavaDoc :
ResultSetExtractor의 JavaDoc :
ResultSetExtractor는 RowMapper가 한 번에 한 행씩 공급되는 동안 전체 ResultSet (가능한 여러 행)을 추출한다고 가정합니다.
-
==============================
2.기본 차이점은 ResultsetExtractor를 사용하면 while 루프에서 말한 결과 세트를 반복해야합니다. 이 인터페이스는 한 번에 전체 ResultSet을 처리합니다. 인터페이스 메소드 인 extractData (ResultSet rs)의 구현에는 해당 수동 반복 코드가 포함됩니다. ResultsetExtractor의 1 구현을 참조
기본 차이점은 ResultsetExtractor를 사용하면 while 루프에서 말한 결과 세트를 반복해야합니다. 이 인터페이스는 한 번에 전체 ResultSet을 처리합니다. 인터페이스 메소드 인 extractData (ResultSet rs)의 구현에는 해당 수동 반복 코드가 포함됩니다. ResultsetExtractor의 1 구현을 참조
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
개별 객체의 경우 (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; }
}
최적 사용 사례 :
행 매퍼 (Row Mapper) : ResultSet의 각 행이 도메인 객체에 매핑 될 때 개인 내부 클래스로 구현 될 수 있습니다.
RowCallbackHandler : 각 행에 대해 콜백 메소드에서 반환 된 값이없는 경우 (예 : 파일에 행 작성, 행을 XML로 변환, 콜렉션에 추가하기 전에 행 필터링. ObjectSettings에 대한 ResultSet만큼 매우 효율적입니다.
ResultSetExtractor : ResultSet의 여러 행이 단일 Object에 매핑 될 때. 쿼리에서 복잡한 조인을 할 때와 마찬가지로 복잡한 Object를 빌드하기 위해 rs의 단일 행 대신 전체 ResultSet에 액세스해야하며 ResultSet을 완전히 제어하려고 할 수 있습니다. TABLE1과 TABLE2의 조인에서 리턴 된 행을 완전히 재구성 된 TABLE 집계로 맵핑하는 것과 마 y 가지입니다.
ParameterizedRowMapper는 복잡한 객체를 만드는 데 사용됩니다.
-
==============================
3.RowMapper : 한 번에 하나의 ResultSet 레코드를 처리합니다.
RowMapper : 한 번에 하나의 ResultSet 레코드를 처리합니다.
ResultSetExtractor : 한 번에 ResultSet의 여러 레코드를 처리합니다.
-
==============================
4.ResultSetExtractor가 유리한 곳 중 하나는 (스토어드 프로 시저 호출과 같은) 결과와 행 매퍼가있을 때와 같은 jdbcTemplate 메소드의 커버 아래에서 처리되는 것처럼 처리하려고 할 때라고 생각합니다. query (String sql, RowMapper rowMapper). 이 경우 RowMapper 대신 ResultSetExtractor를 사용하여 결과 집합을 수동으로 반복하지 않아도됩니다.
ResultSetExtractor가 유리한 곳 중 하나는 (스토어드 프로 시저 호출과 같은) 결과와 행 매퍼가있을 때와 같은 jdbcTemplate 메소드의 커버 아래에서 처리되는 것처럼 처리하려고 할 때라고 생각합니다. query (String sql, RowMapper rowMapper). 이 경우 RowMapper 대신 ResultSetExtractor를 사용하여 결과 집합을 수동으로 반복하지 않아도됩니다.
예 :
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);
from https://stackoverflow.com/questions/10074025/what-is-difference-between-resultsetextractor-vs-rowmapper by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 부트 - Application.properties의 사용자 정의 변수 (0) | 2019.01.26 |
---|---|
[SPRING] Spring @SubscribeMapping은 실제로 어떤 주제에 클라이언트를 구독합니까? (0) | 2019.01.26 |
[SPRING] 자바 웹 서비스 프레임 워크 / 라이브러리, 더 나은 이유는 무엇입니까? (0) | 2019.01.26 |
[SPRING] Jars는 Tomcat의 lib 폴더에 복사되지 않았습니다. (0) | 2019.01.26 |
[SPRING] 스프링 인터페이스 주입 예제 (0) | 2019.01.26 |