2012-04-09 150 views
33

我曾經在行映射器和結果集提取器回調接口上工作。我發現區別在於,我發現區別在於,我們可以導航所有行,返回類型是對象。ResultSetExtractor vs Rowmapper有什麼區別?

除上面以外,還有什麼區別嗎?Rowmapper的內部和返回類型是如何工作的?

+1

在我看來,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

回答

22

JavaDoc of ResultSetExtractor

此接口主要使用的JDBC框架本身內。 RowMapper通常是ResultSet處理的一個更簡單的選擇,每行爲一個結果對象映射,而不是整個ResultSet的一個結果對象。

ResultSetExtractor是假設以提取全ResultSet(可能多個行),而RowMapper在時間與行feeded。

又見

+7

ResultSetExtractor已在框架外部使用,例如,使用單個SQL語句將一個映射到多個映像非常有用,例如具有一組假期的Employee 。 – 2015-03-31 09:53:06

31

基本區別是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用於創建複雜的對象

+0

很好解釋。 – phoenixSid 2018-01-18 12:44:09

0

我覺得一個地方,一個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); 
0

RowMapper:要處理結果集的一條記錄的時間。

ResultSetExtractor:一次處理多個ResultSet記錄。

+0

應該添加爲註釋。 – arqam 2018-02-07 05:58:38

相關問題