分享

spring JdbcTemplate的queryForObject为空返回异常情况的一个处理

 青_春 2016-04-05
看spring的queryForObject(如果查询结果条数为0或者大于1)都会返回异常,我们希望没查到返回null,这样我们就可以给用户提示没有找到,要不我们的每个queryforObject,queryForInt...等等方法都需要手动拦截这个异常来判断为空,才能做出判断。
先看下spring的这段源码:
public <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException {
  List<T> results = query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper, 1));
  return DataAccessUtils.requiredSingleResult(results);
}
public static <T> T requiredSingleResult(Collection<T> results) throws IncorrectResultSizeDataAccessException {
  int size = (results != null ? results.size() : 0);
  if (size == 0) {//记录为o返回异常
   throw new EmptyResultDataAccessException(1);//此异常继承自IncorrectResultSizeDataAccessException
  }
  if (results.size() > 1) {有多条记录返回异常
   throw new IncorrectResultSizeDataAccessException(1, size);
  }
  return results.iterator().next();
 }


下面是我的一个方法,其他的方法请大家补充:
写一个接口定义规则:
public interface JdbcTemplateCallBack<T> {
    public  T querys(JdbcTemplate jdbcTemplate);
}
然后是BaseDao的通用的方法:
/**
     * 可以用于处理查询queryfor 为空或者多条的时候返回异常的情况,现在返回null,主要是拦截IncorrectResultSizeDataAccessException异常,以及子类
     * 
@param jdbcTemplateCallBack
     * 
@return
     * 
@throws DaoException
     
*/
    public <T> T queryNullAble(JdbcTemplateCallBack<T> jdbcTemplateCallBack) throws DaoException {
        try {
            return jdbcTemplateCallBack.querys(getJdbcTemplate());
        } catch (Exception e) {
                if((e instanceof IncorrectResultSizeDataAccessException)
                        &&((IncorrectResultSizeDataAccessException)e).getActualSize()==0)
                    return null;
            //其他的异常正常抛出
            throw new DaoException(e);
        }
    }

最后是调用实例(根据id查用户):
public SUser getUserByColunm(final String columnName, final Object value) throws DaoException {
        return queryNullAble(new JdbcTemplateCallBack<SUser>() {
            public SUser querys(JdbcTemplate jdbcTemplate) {
                return jdbcTemplate.queryForObject("select *  from suser where "+columnName+"=?", new BeanPropertyRowMapper(SUser.class),value);
            }
        });
    }

具体的工程可以在http://www./freeman1984/archive/2011/10/24/361899.html里面下载。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约