use*_*214 39 spring jdbctemplate
我在行映射器和结果集提取器回调接口上工作.我发现了差异,即,
1.Row mapper可以按行处理.但是Resultset提取器我们可以naviagte所有行,返回类型是object.
除了上面有什么区别吗?.Rowmapper内部和返回类型的工作如何列表?
vim*_*hna 39
与ResultsetExtractor的基本区别在于,您需要自己遍历结果集,比如在while循环中.此界面可让您立即处理整个ResultSet.Interface方法extractData(ResultSet rs)的实现将包含该手动迭代代码. 请参阅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
Run Code Online (Sandbox Code Playgroud)
对于单个对象(使用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;
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
}
最佳使用案例:
行映射器:当ResultSet的每一行映射到域Object时,可以实现为私有内部类.
RowCallbackHandler:当没有从每个行的回调方法返回值时,例如将行写入文件,将行转换为XML,在添加到集合之前过滤行.这里没有完成ResultSet to Object映射非常有效.
ResultSetExtractor:当多行ResultSet映射到单个Object时.就像在查询中进行复杂连接一样,可能需要访问整个ResultSet而不是单行rs来构建复杂的Object,并且您希望完全控制ResultSet.将从TABLE1和TABLE2的连接返回的行映射到完全重构的TABLE聚合.
ParameterizedRowMapper用于创建复杂对象
Tom*_*icz 27
该接口主要用于JDBC框架本身.对于ResultSet处理,RowMapper通常是一个更简单的选择,每行映射一个结果对象,而不是整个ResultSet映射一个结果对象.
ResultSetExtractor
假设提取整个ResultSet
(可能是多行),同时RowMapper
一次排成一行.