1. 程式人生 > >SHH中的BaseDao(增刪改查操作)

SHH中的BaseDao(增刪改查操作)

抽取BaseDao

將Dao中可能遇到的增刪改查方法抽取出來封裝到類中。這樣Dao只需要繼承BaseDao就可以擁有增刪改查功能。體現面向切面程式設計,減少程式碼量。

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