Hibernate中BaseDao抽取(反射泛型)

在BaseDao中使用反射+泛型可以簡化代碼

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

	private Class pClass;
	//構造方法(這裏是核心)
	public BaseDaoImpl() {
		//第一步 得到當前運行類Class
		Class clazz = this.getClass();
//		System.out.println("****************"+clazz);
		
		//第二步 得到運行類的 父類的參數化類型 BaseDaoImpl<Customer>
		// Type getGenericSuperclass()  
		Type type = clazz.getGenericSuperclass();
		// 使用Type子接口 ParameterizedType
		ParameterizedType ptype = (ParameterizedType) type;
//		System.out.println("***********"+ptype);
		
		//第三步 得到實際類型參數<Customer>裏面Customer
		//Type[] getActualTypeArguments() 
		Type[] types = ptype.getActualTypeArguments();
		//Type接口實現類Class
		Class tclass = (Class) types[0];
//		System.out.println("*****"+pclass);
		this.pClass = tclass;
	}
	
	//根據id查詢
	@SuppressWarnings("all")
	public T findOne(int id) {
		//不能寫 T.class
		return (T) this.getHibernateTemplate().get(pClass, id);
	}

	//查詢所有
	@SuppressWarnings("all")
	public List<T> findAll() {
		//使用Class裏面getSimpleName() 得到類名稱
		return (List<T>) this.getHibernateTemplate().find("from "+pClass.getSimpleName());
	}
	
	//添加
	public void add(T t) {
		this.getHibernateTemplate().save(t);
	}
	
	//修改
	public void update(T t) {
		this.getHibernateTemplate().update(t);
	}

	//刪除
	public void delete(T t) {
		this.getHibernateTemplate().delete(t);
	}
}

後面的Dao包下的類只需要繼承BaseDao就擁有了它的方法。

public class CustomerDaoImpl extends BaseDaoImpl<Customer>  {   ...}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章