JdbcTemplate做为一种常用的和数据库交互的方式,用起来很方便。但是当查询结果为map时要求查询的结果有且仅有一条数据。接下来我们看看源码到底是如何处理的。
重点看第三个截图,如何处理查询结果的,如果查询结果为空,则throw new EmptyResultDataAccessException(1);,如果结果大于1条,则throw new IncorrectResultSizeDataAccessException(1, results.size());
我们看一下这两个异常,发现EmptyResultDataAccessException是IncorrectResultSizeDataAccessException的一个子类。
当抛出这个异常后,我们在控制台上看到的就是下面这个方法打印的语句。
那么,如何在Dao层该如何处理呢,因为我们会在service中处理事务,所有会将dao层的异常抛到service,但是查询map为空时是合理的,所以我们一般会捕获EmptyResultDataAccessException,map为多条数据时我们认为不合理,一般会抛出去 ,接下来我们看看写的代码,一般情况下我们只捕获EmptyResultDataAccessException ,返回null。IncorrectResultSizeDataAccessException 异常我们不进行捕获,会直接抛出处理后返回给前端页面。
public Map<String,Object> queryDetail(String id) throws Exception {
String sql="select * from `v_device_user` where status=1 and data_id = ?";
try {
return jdbcTemplate.queryForMap(sql, new Object[]{id});
}catch (EmptyResultDataAccessException e){
// 查询不到数据的时候
e.printStackTrace()
return null;
}catch (IncorrectResultSizeDataAccessException e){
// 查询到不止一条数据的时候
e.printStackTrace()
return null;
}
}
一般我们这样写即可处理业务需求,在实际开发中应根据具体业务进行处理。
public Map<String,Object> queryDetail(String id) throws Exception {
String sql="select * from `test` where status=1 and data_id = ?";
try {
return jdbcTemplate.queryForMap(sql, new Object[]{id});
}catch (EmptyResultDataAccessException e){
// 查询不到数据的时候
e.printStackTrace()
return null;
}
}