복붙노트

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

SPRING

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

나는 행 매퍼와 결과 추출기 콜백 인터페이스에서 작업했습니다. 차이점을 발견했습니다. 즉,

1.Row mapper는 행 단위로 처리 할 수 ​​있습니다. 그러나 Resultset 추출기는 모든 행을 탐색하고 반환 유형은 객체입니다.

위와 다른 점이 있습니까? Rowmapper 내부 및 반환 유형이 어떻게 작동하나요?.

해결법

  1. ==============================

    1.ResultSetExtractor의 JavaDoc :

    ResultSetExtractor의 JavaDoc :

    ResultSetExtractor는 RowMapper가 한 번에 한 행씩 공급되는 동안 전체 ResultSet (가능한 여러 행)을 추출한다고 가정합니다.

  2. ==============================

    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. ==============================

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

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

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

  4. ==============================

    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);
    
  5. from https://stackoverflow.com/questions/10074025/what-is-difference-between-resultsetextractor-vs-rowmapper by cc-by-sa and MIT license