使用泛型和反射技術簡化Spring jdbcTemplate的使用

最近沒事兒研究了下springMVC,由於不想用hibernate,因此就是用了spring自帶的jdbcTemplate。在使用的過程當中發現spring jdbcTemplate須要本身實現將結果集轉化爲對象的操做,我的感受非常繁瑣,因而就使用泛型和反射對這個過程進行了封裝,來簡化jdbcTemplate的使用。廢話少說,上代碼: java

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。 spring

// 使用BeanUtils經過字段名將value設置到實體中             
 BeanUtils.setProperty(t, fieldName, o);

這裏使用BeanUtils而不是PropertyUtils,是由於BeanUtils會對對象類型進行自動轉換。 sql

注:實體中若是有多餘的字段,即數據表中沒有的字段,程序就會報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);

這樣,就能夠獲得查詢的對象值了。 app

到此結束~若是程序有不妥之處,還望大大們加以指正~ ide

給你們推薦本好書《spring in action》,淘寶上最便宜的哦 this

Spring in Action(第二版)中文版/(美)沃爾斯,(美)佈雷登 spa

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

相關文章
相關標籤/搜索