SHH中的BaseDao(增刪改查操作)
阿新 • • 發佈:2019-02-16
抽取BaseDao
將Dao中可能遇到的增刪改查方法抽取出來封裝到類中。這樣Dao只需要繼承BaseDao就可以擁有增刪改查功能。體現面向切面程式設計,減少程式碼量。
BaseDao的設計思路
具體實現
BaseDao介面書寫
//Dao類父介面,封裝了增刪改查方法
//為了方便方便所有Dao繼承使用泛型
public interface BaseDao<T> {
//增
void save(T t);
//通過物件刪除
void delete(T t);
//通過Id刪除 -- 因為id的型別(八大基本型別+String)一定是serializable的實現類所以使用serializable
void delete(Serializable id);
//改
void update(T t);
//通過Id查詢
T getById(Serializable id);
//查詢符合條件的總記錄數
Integer getTotalCount(DetachedCriteria dc);
//查詢分頁列表資料
List<T> getPageList(DetachedCriteria dc, Integer start, Integer end);
}
BaseDao的實現類
//BaseDao的具體實現類
//因為這裡還是不知道泛型的具體型別所以這裡也加上泛型
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
//通過hibernateTemplate來操作資料庫
private Class clz; //用來接收當前執行類的泛型
public BaseDaoImpl() {
/*this.getClass().getGenericSuperclass()可以獲得當前型別的帶有泛型型別的父類(反射)
結合原理圖來看當前執行類為customerDaoImpl,父類即BaseDaoImpl
返回值為type型別,用一個實現類ParameterizedType來接收*/
ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
//getActualTypeArguments()獲得執行期的泛型型別位元組碼物件陣列
clz = (Class) ptClass.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
super.getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
super.getHibernateTemplate().delete(t);
}
@Override
public void delete(Serializable id) {
T t = this.getById(id);
this.delete(t);
}
@Override
public void update(T t) {
super.getHibernateTemplate().update(t);
}
@Override
public T getById(Serializable id) {
//這裡需要執行期類的泛型的位元組碼物件
return (T) super.getHibernateTemplate().get(clz, id);
}
@Override
public Integer getTotalCount(DetachedCriteria dc) {
//設定查詢的聚合函式,總記錄數
dc.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
//清空之前設定的聚合函式,避免其他函式呼叫dc查詢資料庫時出現問題
dc.setProjection(null);
if(list!=null && list.size()>0){
Long count = list.get(0);
return count.intValue();
}else{
return null;
}
}
@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer end) {
List<T> list = (List<T>) super.getHibernateTemplate().findByCriteria(dc, start, end);
return list;
}
}
業務Dao中的應用
Dao實現類不需要繼承hibernateDaoSupport而是直接繼承BaseDaoImpl(繼承了hibernateDaoSupport)。這樣就可以直接使用BaseDaoImpl中的增刪改查方法。
@Repository("userDao")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
技術交流:713788313