同一个查询,使用:
1 | List<T> query(String sql, RowMapper<T> rowMapper, Object... args) |
这两个方法可以执行成功,但是
1 | T query(String sql, ResultSetExtractor<T> rse, Object... args) |
执行时会报如下异常信息:
1 | Caused by: java.sql.SQLException: No current row in the ResultSet. |
代码为:
1 | String sql = "select id, name from user where id = ?"; |
第一种和第二种写法中的 RowMapper
和 RowCallbackHandler
对象分别构造了 RowMapperResultSetExtractor
和RowCallbackHandlerResultSetExtractor
对象,它们都是 ResultSetExtractor
的子类。
ResultSetExtractor
类中的 extractData
方法定义为:
1 | T extractData(ResultSet rs) throws SQLException, DataAccessException; |
RowMapperResultSetExtractor
类定义为:
1 | public class RowMapperResultSetExtractor<T> implements ResultSetExtractor<List<T>> { |
第一种写法中形参表里的 lambda
表达式就是 rowMapper
的匿名构造类。
RowCallbackHandlerResultSetExtractor
类定义为:
1 | private static class RowCallbackHandlerResultSetExtractor implements ResultSetExtractor<Object> { |
第二种写法中形参表里的 lambda
表达式就是 rch
的匿名构造类。
所以前两种写法,已经默认执行了循环解析 ResultSet
结果集这个操作。而第三种写法需要自己重写ResultSetExtractor
类的 extractData()
方法。所以将第三种写法改成以下形式即可:
// ResultSetExtractor
return jdbcTemplate.query(sql, rs -> {
if (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
return null;
}, userId);
如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理