使用泛型和反射技术简化Spring jdbcTemplate的使用

与世无争的帅哥 提交于 2019-12-01 04:56:28

最近没事儿研究了下springMVC,因为不想用hibernate,所以就是用了spring自带的jdbcTemplate。在使用的过程中发现spring jdbcTemplate需要自己实现将结果集转化为对象的操作,个人感觉很是繁琐,于是就使用泛型和反射对这个过程进行了封装,来简化jdbcTemplate的使用。废话少说,上代码:

public class MyRowMapper<T> implements RowMapper {

	private Class<T> cls;
 	
	public MyRowMapper(Class<T> cls) {
		this.cls = cls;
	}
	
	@Override
	public Object mapRow(ResultSet rs, int num) throws SQLException {
		T t = null;
		try {
			// 获取对象中的所有字段
			Field[] fields = cls.getDeclaredFields();
			// 实例化
			t = cls.newInstance();
			for(Field f : fields){
//				if(f.isAnnotationPresent(NotPersistent.class)){
//					continue;
//				}
                                // 获取字段名称
                                String fieldName = f.getName();
                                if(StringUtils.isBlank(fieldName)){
					continue;
				}
				Object o = null;
                                // 通过字段名称获取该字段的值(实体字段名称必须与数据库字段名称一致才可以)
                                o = rs.getObject(fieldName);
				if(o == null){
					continue;
				}
                                // 使用BeanUtils通过字段名将value设置到实体中             
                                BeanUtils.setProperty(t, fieldName, o);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

}

在这里,我新建了一个类实现了RowMapper接口,并在内部提供了一个带参的构造方法,这样mapRow方法就可以通过全局变量来获取到传进来的Class。

// 使用BeanUtils通过字段名将value设置到实体中             
 BeanUtils.setProperty(t, fieldName, o);

这里使用BeanUtils而不是PropertyUtils,是因为BeanUtils会对对象类型进行自动转换。

注:实体中如果有多余的字段,即数据表中没有的字段,程序就会报java.sql.SQLException: Column not found异常,在这种情况下,你可以对多余字段进行处理,我在这里是使用注解的方式:

if(f.isAnnotationPresent(NotPersistent.class)){
	continue;
}
这样,在使用spring jdbcTemplate的时候,就方便多了。比如有个Sort类:
RowMapper rowMapper = new MyRowMapper<Sort>(Sort.class);
Sort sort = (Sort) jdbcTemplate.queryForObject(sql.toString(), conditionVals, rowMapper);

这样,就可以得到查询的对象值了。

到此结束~如果程序有不妥之处,还望大大们加以指正~

给大家推荐本好书《spring in action》,淘宝上最便宜的哦

Spring in Action(第二版)中文版/(美)沃尔斯,(美)布雷登

http://s.click.taobao.com/t?e=zGU34CA7K%2BPkqB07S4%2FK0CITy7klxxrJ35Nnc0vb%2BPmI9HDTrpal4A6qV1r%2FDhNOYiKMK4Umg2pyZmBF4pIVGMjAd37nwxzIa2NCKsEd9nZVBQ%3D%3D


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!