使用jdbc的方法queryForObject()查询,当没有符合结果时,会抛出异常。导致在业务处理时需要先判断依据条件查询是否存在结果,才能进行调用查询,如下:
// 查询用户信息
AuthUserInfoEntity authUserInfoEntity = new AuthUserInfoEntity();
authUserInfoEntity.setId(id);
if (authUserInfoDao.exists(authUserInfoEntity)) {
authUserInfoEntity = authUserInfoDao.findOne(id);
AuthUserInfoDto authUserInfoDto = new AuthUserInfoDto();
BeanUtils.copyProperties(authUserInfoDto, authUserInfoEntity);
return new Response(status.value(), msg, authUserInfoDto);
} else {
status = HttpStatus.NO_CONTENT;
msg = "找不到相关信息!";
}
直接继承JdbcTemplate,重写queryForObject()方法,如下:
package com.xakj.util;
import java.util.Collection;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.RowMapperResultSetExtractor;
public class IJdbcTemplate extends JdbcTemplate {
/**
* 重写JdbcTemplate里面的queryForObject方法源码调用的requiredSingleResult,
* 当查询到的结果为空时返回null(原来是抛出异常)
*/
@Override
public T queryForObject(String sql, Class requiredType)
throws DataAccessException {
return queryForObject(sql, getSingleColumnRowMapper(requiredType));
}
@Override
public T queryForObject(String sql, RowMapper rowMapper)
throws DataAccessException {
List results = query(sql, rowMapper);
return requiredSingleResult(results);
}
@Override
public T queryForObject(String sql, RowMapper rowMapper, Object... args)
throws DataAccessException {
List results = query(sql, args, new RowMapperResultSetExtractor(rowMapper, 1));
return requiredSingleResult(results);
}
public static T requiredSingleResult(Collection results)
throws IncorrectResultSizeDataAccessException {
int size = (results != null ? results.size() : 0);
if (size == 0) {
return null;
}
if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, size);
}
return results.iterator().next();
}
}
dao层查询时直接调用IJdbcTemplate,
@Autowired
private IJdbcTemplate jdbcTemplate;
业务层只需要判断查询结果是否为空即可。
不使用重写,而是直接修改dao的查询方法
查询单个对象原代码:
/**
* 查询单个对象原代码
*/
@Override
public AuthUserInfoEntity findOne(String id) {
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * ");
sql.append(" FROM AUTH_USER_INFO WHERE 1=1 ");
RowMapper rowMapper = new BeanPropertyRowMapper(AuthUserInfoEntity.class);
return this.jdbcTemplate.queryForObject(sql.toString(), rowMapper, id);
}
查询单个对象优化代码:
/**
* 查询单个对象优化代码
*/
@Override
public AuthUserInfoEntity findOne(String id) {
StringBuffer sql = new StringBuffer();
List
业务层也是需要判断是否为空。
很明显第一种方式更为合理,第二种方式不推荐使用,代码越简单越好。但JdbcTemplate底层实质上queryForObject()方法还是调用了query方法,只是返回时获取了第一个值而已。