主要介绍几种查询的特殊情况
-
jdbcTemplate.queryForList
如果没有查找到记录 ,会返回一个 size=0 的空集合 ,
这主要是因为 在处理查询结果时List results = this.rowsExpected > 0 ? new ArrayList(this.rowsExpected) : new ArrayList();
2.jdbcTemplate.queryForMap
必须返回一条记录 ,未查找到记录 或者 查找到多条记录 ,都会报错
int size = results != null ? results.size() : 0;
if (size == 0) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, size);
} else {
return results.iterator().next();
}
- jdbcTemplate.queryForObject
必须返回一条记录 ,未查找到记录 或者 查找到多条记录 ,都会报错
int size = results != null ? results.size() : 0;
if (size == 0) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, size);
} else {
return results.iterator().next();
}
queryForMap 和 queryForObject 看上去是不是相同的情况?
没错,就是相同的。不论是 queryForMap 还是 queryForObject
都是先使用 queryForList 查询记录,然后再取 List 里的第一条记录进行处理。
并且 queryForMap 是直接复用 queryForObject , 其实从类的继承关系上来看
Map 是 Object的子类,复用的话也是合理的。
public Map<String, Object> queryForMap(String sql) throws DataAccessException {
return (Map)this.queryForObject(sql, this.getColumnMapRowMapper());
}
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws DataAccessException {
List<T> results = this.query(sql, rowMapper);
return DataAccessUtils.requiredSingleResult(results);
}