1. 程式人生 > >WEB開發Dao層的抽取(獲取泛型的Class物件,實現查詢方法的抽取)

WEB開發Dao層的抽取(獲取泛型的Class物件,實現查詢方法的抽取)

在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;
	}
}