在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> { ...}