最近沒事兒研究了下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