Spring ResultsTextRactor和Rowmapper之间有什么区别?

Spring ResultsTextRactor和Rowmapper之间有什么区别?,spring,jdbctemplate,Spring,Jdbctemplate,我研究了行映射器和结果集提取器回调接口。我发现了不同之处,即 1.行映射器可以按行处理。但Resultset提取器可以导航所有行,返回类型为object 除上述内容外,还有其他区别吗?行映射器内部和返回类型是如何工作的列表?: 该接口主要用于JDBC框架本身。对于结果集处理,行映射器通常是一种更简单的选择,它为每行映射一个结果对象,而不是为整个结果集映射一个结果对象 假设提取整个结果集(可能有多行),同时一次提供行 大多数情况下,ResultSetExtractor将循环ResultSet并使用

我研究了行映射器和结果集提取器回调接口。我发现了不同之处,即

1.行映射器可以按行处理。但Resultset提取器可以导航所有行,返回类型为object

除上述内容外,还有其他区别吗?行映射器内部和返回类型是如何工作的列表?

该接口主要用于JDBC框架本身。对于结果集处理,行映射器通常是一种更简单的选择,它为每行映射一个结果对象,而不是为整个结果集映射一个结果对象

假设提取整个
结果集(可能有多行),同时一次提供行

大多数情况下,
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;
List results=(this.rowsExpected>0?新建ArrayList(this.rowsExpected):新建ArrayList());
int rowNum=0;
while(rs.next()){
add(this.rowMapper.mapRow(rs,rowNum++));
}
返回结果;
请注意,所有结果都将被转换,这可能会造成内存不足异常

另见

基本区别在于ResultSetTextRactor,您需要自己迭代结果集,比如在while循环中。 此接口提供了一次对整个结果集的处理。接口方法extractData(ResultSet rs)的实现将包含该手动迭代代码。

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

RowMapper可用于映射每一行或整行

对于整行对象(按模板方法jdbcTemplate.query())

对于单个对象(使用模板方法jdbcTemplate.queryForObject())


}

最佳使用案例:

行映射器:当结果集的每一行映射到域对象时,可以作为私有内部类实现

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

ResultSetExtractor:当多行ResultSet映射到单个对象时。与在查询中执行复杂连接时一样,您可能需要访问整个ResultSet,而不是一行rs来构建复杂对象,并且您希望完全控制ResultSet。类似于将从表1和表2的联接返回的行映射到完全重构的表聚合


ParameterizedRowMapper用于创建复杂对象

我认为ResultsTextRactor的一个优势是,当您拥有一个结果集(比如调用存储过程)和一个行映射器,并且希望像处理jdbcTemplate方法(比如查询)一样处理它们(字符串sql,RowMapper RowMapper)。在这种情况下,您可以通过使用ResultSetTextRactor而不仅仅是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;
ResultSet ResultSet=cs.executeQuery();
int行=0;
DateRowMapper DateRowMapper=新的DateRowMapper();
列表日期=新建ArrayList();
while(resultSet.next()){
add(dateRowMapper.mapRow(resultSet,++row));
}
返回日期;
结果文本采集器

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

行映射器
:一次处理一条结果集记录


ResultSetExtractor
:一次处理ResultSet的多条记录。

在我看来,行映射器要简单得多,您可能最终会使用它而不是ResultSetExtractor。但要了解更多信息,请查看,ResultSetExtractor在框架之外有用途,例如,它对于映射一对多usi非常有用正在删除单个SQL语句,例如带有一组假日的员工。但RowMapper和ResultsTextRactor可用于获取记录列表??解释得很好。应改为添加注释。
@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 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);