JdbcTemplate中的ResultSetExtractor和RowMapper有什么区别?

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通过这两个接口,可以灵活的处理查询结果和自定义返回值,这也使它成为一个强大易用的持久层框架。