zoukankan      html  css  js  c++  java
  • Dao层抽取BaseDao

    结构图

     

    BaseDao.java

    import java.io.Serializable;
    import java.util.List;
    import org.hibernate.criterion.DetachedCriteria;
    
    public interface BaseDao<T> {
    
        //
        void save(T t);
        //
        void delete(T t);
        //
        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 pageSize);
    }

    BaseDaoImpl.java

    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.util.List;
    
    import org.hibernate.criterion.DetachedCriteria;
    import org.hibernate.criterion.Projections;
    import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
    
    import cn.itcast.dao.BaseDao;
    
    public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
    
        private Class clazz;//用于接收运行期泛型类型
        
        public BaseDaoImpl(){
            //获得当前类型的带有泛型类型的父类
            ParameterizedType pd = (ParameterizedType) this.getClass().getGenericSuperclass();
            clazz = (Class) pd.getActualTypeArguments()[0];
        }
        
        @Override
        public void save(T t) {
            getHibernateTemplate().save(t);
        }
    
        @Override
        public void delete(T t) {
            getHibernateTemplate().delete(t);
        }
    
        @Override
        public void delete(Serializable id) {
            T t = this.getById(id);
            getHibernateTemplate().delete(t);
        }
    
        @Override
        public void update(T t) {
            getHibernateTemplate().update(t);
        }
    
        @Override
        public T getById(Serializable id) {
    
            return (T) getHibernateTemplate().get(clazz.getClass(), 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 pageSize) {
            
            List<T> lsit = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
            return lsit;
        }
    
    }

    CustomerDao.java

    public interface CustomerDao extends BaseDao<Customer> {
        //可以定义BaseDao中没有的方法,定义私有方法
    }

    CustomerDaoImpl.java

    public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
        
    }

    总结:这样定义BaseDao使得把所有dao上的共同方法抽取到一个dao上,减少了代码量,并且在每个dao上还可以定义私有的方法,用来实现BaseDao不能实现的功能。

  • 相关阅读:
    C++头文件编译问题
    Windows下Critical Section、Event、Mutex、Semaphores区别
    MFC OnCtlColor函数用来改变控件颜色
    Ctreectrl +CImageList应用
    20091113 08:37 实现文件读写操作的几种方法
    在网上看到这篇文章还不错,OnDrawItem与DrawItem讨论
    Mysql全文搜索match…against的用法
    Django and fulltext search
    Feed DB 搜博客 一个博客搜索引擎
    通过扩展Django数据库API支持全文搜索
  • 原文地址:https://www.cnblogs.com/ms-grf/p/7493147.html
Copyright © 2011-2022 走看看