ResultSetExtractor与Rowmapper有什么区别?

时间:2012-04-09 13:35:12

标签: spring jdbctemplate

我在行映射器和结果集提取器回调接口上工作。我发现了差异,即

1.Row mapper可以按行处理。但是Resultset提取器我们可以naviagte所有行,返回类型是object。

除了上面有什么不同吗?。Rowmapper内部和返回类型的工作如何列表?。

4 个答案:

答案 0 :(得分:36)

与ResultsetExtractor的基本区别在于,您需要自己遍历结果集,比如while循环。 此界面可让您立即处理整个ResultSet。 Interface方法extractData(ResultSet rs)的实现将包含该手动迭代代码。 See one implementation of ResultsetExtractor

当一些回调处理程序如RowCallbackHandler时,接口方法processRow(ResultSet rs)为你循环。

可以使用RowMapper来映射每一行或整行。

对于整行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的每一行映射到域Object时,可以实现为私有内部类。

RowCallbackHandler:如果没有为每行的回调方法返回任何值,例如将行写入文件,将行转换为XML,在添加到集合之前过滤行。这里没有完成ResultSet to Object映射非常有效。

ResultSetExtractor:当多行ResultSet映射到单个Object时。就像在查询中进行复杂连接一样,可能需要访问整个ResultSet而不是单行rs来构建复杂的Object,并且您希望完全控制ResultSet。比如将TABLE1和TABLE2的连接返回的行映射到完全重构的TABLE聚合。

ParameterizedRowMapper 用于创建复杂对象

答案 1 :(得分:24)

JavaDoc of ResultSetExtractor

  

此接口主要在JDBC框架内部使用。 RowMapper通常是ResultSet处理的一个更简单的选择,每行映射一个结果对象而不是整个ResultSet的一个结果对象。

ResultSetExtractor假设提取整个ResultSet(可能是多行),而RowMapper一次排成一行。

另见

答案 2 :(得分:1)

ResultSetExtractor:一次处理一个ResultSet记录。

purchase_order_number:一次处理ResultSet的多个记录。

答案 3 :(得分:0)

我认为ResultSetExtractor可能有利的一个地方就是你有一个结果集(比如从对存储过程的调用)和行映射器,并希望像在jdbcTemplate方法的封面下那样处理它们,例如query(String 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);