我曾經在行映射器和結果集提取器回調接口上工作。我發現區別在於,我發現區別在於,我們可以導航所有行,返回類型是對象。ResultSetExtractor vs Rowmapper有什麼區別?
除上面以外,還有什麼區別嗎?Rowmapper的內部和返回類型是如何工作的?
我曾經在行映射器和結果集提取器回調接口上工作。我發現區別在於,我發現區別在於,我們可以導航所有行,返回類型是對象。ResultSetExtractor vs Rowmapper有什麼區別?
除上面以外,還有什麼區別嗎?Rowmapper的內部和返回類型是如何工作的?
JavaDoc of ResultSetExtractor
:
此接口主要使用的JDBC框架本身內。 RowMapper通常是ResultSet處理的一個更簡單的選擇,每行爲一個結果對象映射,而不是整個ResultSet的一個結果對象。
ResultSetExtractor
是假設以提取全ResultSet
(可能多個行),而RowMapper
在時間與行feeded。
ResultSetExtractor已在框架外部使用,例如,使用單個SQL語句將一個映射到多個映像非常有用,例如具有一組假期的Employee 。 – 2015-03-31 09:53:06
基本區別是ResultSetExtractor類則需要通過結果來迭代自己設定,說,在while循環。 此接口可以一次處理整個ResultSet。 Interface方法extractData(ResultSet rs)的實現將包含該手動迭代代碼。 See one implementation of ResultsetExtractor
while 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
對於單個對象(使用模板方法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,在添加到集合之前過濾行。結果集到對象映射的效率非常高效。
ResultSetExtractor:當多行ResultSet映射到單個對象時。就像在查詢中執行復雜的連接時一樣,可能需要訪問整個ResultSet而不是rs的單個行來構建複雜對象,並且您想要完全控制ResultSet。像將從TABLE1和TABLE2的連接返回的行映射到完全重新構建的TABLE聚合。
了ParameterizedRowMapper用於創建複雜的對象
很好解釋。 – phoenixSid 2018-01-18 12:44:09
我覺得一個地方,一個RowSetExtractor可能是有利的是,當你有一個結果集(比如從一個存儲過程的調用)和行映射器,和想要處理它們就像在jdbcTemplate方法的覆蓋下完成的那樣,比如query(String sql,RowMapper rowMapper)。在這種情況下,您可以避免使用RowSetExtractor而不是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);
RowMapper
:要處理結果集的一條記錄的時間。
ResultSetExtractor
:一次處理多個ResultSet記錄。
應該添加爲註釋。 – arqam 2018-02-07 05:58:38
在我看來,RowMapper簡單得多,你可能最終會使用它而不是ResultSetExtractor。但要了解更多信息,請查看[JavaDoc](http://static.springsource.org/spring/docs/3.0.0.RC1/javadoc-api/)和[Documentation](http://static.springsource。 org/spring/docs/2.5.x/reference/jdbc.html) – Zack 2012-04-09 13:45:30