WEB開發Dao層的抽取(獲取泛型的Class物件,實現查詢方法的抽取)
阿新 • • 發佈:2018-12-11
在WEB開發中,用到三層架構中經常會遇到程式碼抽取的情況,例如在dao層中,我們需要對資料庫的基本操作進行抽取例如這樣,在抽取之前我們需要定義抽取類的介面:
public interface BaseDao<T> {
public void save(T obj);
public void delete(T obj);
public void update(T obj);
public List<T> getAll();
public T getById(Serializable id);
}
介面定義玩後我們需要定義介面的實現類了:
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{ //該方法用於註解注入SessionFactory物件 @Resource public void setMySessionFactory(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } @Override public void save(T obj) { this.getHibernateTemplate().save(obj); } @Override public void delete(T obj) { this.getHibernateTemplate().delete(obj); } @Override public void update(T obj) { this.getHibernateTemplate().update(obj); } @Override public List<T> getAll() { String hql="from "+clazz.getSimpleName(); List<T> list = (List<T>) this.getHibernateTemplate().find(hql); return list; } @Override public T getById(Serializable id) { } }
在實現類中增、刪、改的方法很容易實現,但由於HibernateTemplate的get方法必須傳入目標物件的Class物件,也就是get(Class<?> clazz,Serializable),由於該類是使用泛型表示“需要查詢的物件型別”,那我們如何獲得該類泛型的Class物件成為了關鍵。(雖然getById()方法也可以像getAll()方法一樣採用HQL查詢,但我們為了演示這個問題,所以不採用這個方法)
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{ //該欄位儲存當前類泛型的Class物件 private Class<T> clazz; public BaseDaoImpl() { //返回表示此 Class 所表示的實體的直接超類的 Type ParameterizedType genericSuperclass = (ParameterizedType)this.getClass().getGenericSuperclass(); //獲得本類宣告的泛型陣列(實際上只有一個) Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); clazz = (Class<T>)actualTypeArguments[0]; } //為了簡介,這裡省略前面已經給出實現過程的方法 ............ @Override public T getById(Serializable id) { T t = this.getHibernateTemplate().get(clazz,id); return t; } }