在使用spring JdbcTemplate的过程中遇到两个问题:
1、queryForObject查询的数据为空时,抛出异常;对于个人来说,我更希望返回null,而非抛出异常;
2、queryForObject正常情况下只能返回基本数据类型,其他javaBean无法返回;
根据上面两点,对JdbcTemplate进行简单的改造,代码如下:
package com.iqibai.jdbc; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.DataAccessUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultSetExtractor; import javax.sql.DataSource; import java.util.List; /** * Created by admin on 2018/5/17. */ public class MyJdbcTemplate extends JdbcTemplate { public MyJdbcTemplate(DataSource dataSource) { super(dataSource); } @Override public <T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper) throws DataAccessException { List<T> results = query(sql, args, argTypes, new RowMapperResultSetExtractor<T>(rowMapper, 1)); return DataAccessUtils.singleResult(results); } @Override 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.singleResult(results); } @Override public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) throws DataAccessException { List<T> results = query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper, 1)); return DataAccessUtils.singleResult(results); } @Override public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws DataAccessException { List<T> results = query(sql, rowMapper); return DataAccessUtils.singleResult(results); } public <T> T queryForBean(String sql, Object[] args, int[] argTypes, Class<T> clazz) throws DataAccessException { return queryForObject(sql,args,argTypes, MapperContainer.getRowMapper(clazz)); } public <T> T queryForBean(String sql, Object[] args, Class<T> requiredType) throws DataAccessException { return queryForObject(sql, args, MapperContainer.getRowMapper(requiredType)); } public <T> T queryForBean(String sql, Class<T> requiredType, Object... args) throws DataAccessException { return queryForObject(sql, args, MapperContainer.getRowMapper(requiredType)); } public <T> List<T> queryForBeanList(String sql, Class<T> elementType) throws DataAccessException { return query(sql, MapperContainer.getRowMapper(elementType)); } public <T> List<T> queryForBeanList(String sql, Class<T> elementType, Object... args) throws DataAccessException { return query(sql, args, MapperContainer.getRowMapper(elementType)); } public <T> List<T> queryForBeanList(String sql, Object[] args, Class<T> elementType) throws DataAccessException { return query(sql, args, MapperContainer.getRowMapper(elementType)); } public <T> List<T> queryForBeanList(String sql, Object[] args, int[] argTypes, Class<T> elementType) throws DataAccessException { return query(sql, args, argTypes, MapperContainer.getRowMapper(elementType)); } }
MapperContainer定义如下:
package com.iqibai.jdbc; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.RowMapper; import java.util.HashMap; import java.util.Map; /** * Created by admin on 2018/5/18. */ public class MapperContainer { private static final Map<String, RowMapper> rowMapping = new HashMap<String, RowMapper>(); public static <T> RowMapper<T> getRowMapper(Class<T> clazz) { RowMapper<T> rm = rowMapping.get(clazz.getName()); if (rm == null) { rm = BeanPropertyRowMapper.newInstance(clazz); rowMapping.put(clazz.getName(),rm); } return rm; } }
当然,这也不是非常的完美,后续会继续进行改造。
Git仓库地址 https://gitee.com/qibaijava/myJdbcTemplate