BaseDao的抽取

在ssh整合開發中,會創建多個不同的dao層對數據庫裏的數據進行crud操作,其實每個裏面用到的方法幾乎都一樣,只是傳遞的參數類型不同.我們可以抽取出一個BaseDao類.由於開發中的高內聚低耦合的思想,所以定義爲一個接口,再創建實現類繼承即可.在接口上定義傳遞類型的泛型,通過反射技術及Class類中的方法獲取.


package cn.itcast.util;


import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.List;


import org.springframework.orm.hibernate5.support.HibernateDaoSupport;


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

//定義一個成員變量,以便後面的方法中使用

private Class clazz;

public BaseDaoImpl() {

//用Object類中的getClass()方法,獲取當前運行類的class對象

Class c = this.getClass();

//得到當前運行類的父類的參數化類型

//Type getGenericSuperclass() 

       //返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type。 

Type type = c.getGenericSuperclass();

//ParameterizedType是Type的子類,將Type強轉爲ParameterizedType類型

ParameterizedType ptype = (ParameterizedType) type;

// Type[] getActualTypeArguments() 

// 返回表示此類型實際類型參數的 Type 對象的數組。 

Type[] t = ptype.getActualTypeArguments();

//獲取實際類型參數

this.clazz = (Class) t[0];

System.out.println(clazz);//--->class cn.itcast.entity.CusVisit全類名

}

@Override

public void save(T t) {

//調用HibernateTemplate模本中的方法

this.getHibernateTemplate().save(t);

}

@Override

public void update(T t) {

this.getHibernateTemplate().update(t);

}

@Override

public void delete(T t) {

this.getHibernateTemplate().delete(t);

}

@Override

public T get(int id) {

T t = (T) this.getHibernateTemplate().get(clazz, id);

return t;

}

@Override

public List<T> list() {

// String getSimpleName() 

        //返回源代碼中給出的底層類的簡稱 

String hql = "from "+clazz.getSimpleName();//-->CusVisit (類名)

List<T> list = (List<T>) this.getHibernateTemplate().find(hql);

return list;

}


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章