ResultSetExtractor和RowMapper是JdbcTemplate中两个重要的接口,主要区别如下:
ResultSetExtractor:
- 用于从ResultSet中提取单个值或对象。
- 典型的实现是查询单行单列,使用queryForObject()方法。
- 返回值可以是任意类型,不限于实体类。
RowMapper:
- 用于从ResultSet中映射每行记录到Java实体类。
- 典型的实现是通过query()方法查询多条记录。
- 返回List<>集合,元素是实体类。
代码示例:
ResultSetExtractor:
String sql = "SELECT COUNT(*) FROM user";
Integer count = jdbcTemplate.queryForObject(sql, new ResultSetExtractor<Integer>() {
public Integer extractData(ResultSet rs) throws SQLException {
rs.next();
return rs.getInt(1);
}
});
- 从ResultSet中提取一个Integer值count
- 使用queryForObject()执行单行单列查询
RowMapper:
String sql = "SELECT * FROM user";
List<User> users = jdbcTemplate.query(sql, new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(rs.getInt("id"), rs.getString("name"));
}
});
- 从ResultSet中映射每行到User实体类
- 返回List,包含全部用户
- 使用query()方法执行查询
所以,ResultSetExtractor用于提取单个值或对象,典型的查询场景是聚合函数。RowMapper用于映射记录集到实体类,适用于查询多条记录。
JdbcTemplate通过这两个接口,可以灵活的处理查询结果和自定义返回值,这也使它成为一个强大易用的持久层框架。