• 对数据库访问的基类


    引入:各个类对数据库的访问基本上都包含了增删改查几大部分。因为基本上都包含这几大部分,如果每个类都写,势必会造成代码量的冗余。再次,我们将各个类都具有的增删改查,具体到一个基类BaseDao接口。同时,BaseDao的实现类BaseDaoImpl将会实现这几个部分的功能。当我们具体的实现类(如CustomerDaoImpl)就可以继承BaseDaoImpl,从而完成CustomerDaoImpl里面操作的实现。

    如图所示:

    代码展示:

      BaseDao.java

     1 package empcl.dao;
     2 
     3 import java.io.Serializable;
     4 import java.util.List;
     5 
     6 import org.hibernate.criterion.DetachedCriteria;
     7 
     8 public interface BaseDao<T> {
     9     //
    10     void save(T t);
    11     //
    12     void delte(T t);
    13     //
    14     void delete(Serializable id);
    15     //
    16     void update(T t);
    17     //查  ------通过id查询
    18     T getById(Serializable id);
    19     //查 ------查询所有符合条件的总记录数
    20     Integer getTotalCount(DetachedCriteria dc);
    21     //查 ------查询分页列表
    22     List<T> getPageList(DetachedCriteria dc,Integer start,Integer pageSize);
    23 }
    package empcl.dao.impl;
    
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    
    import org.hibernate.criterion.DetachedCriteria;
    import org.hibernate.criterion.Projections;
    import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
    
    public class BaseDaoImpl<T> extends HibernateDaoSupport implements empcl.dao.BaseDao<T> {
    
        //确定T类型
        private Class clazz;//用于接收运行期泛型类型
      
        public BaseDaoImpl() {
            //获得当前类型的带有泛型类型的父类 ----->当前运行的是*Dao(如CustomerDao),它的父类为BaseDao
            ParameterizedType ptclass = (ParameterizedType) this.getClass().getGenericSuperclass();
            //获得运行期的泛型类型
            clazz = (Class) ptclass.getActualTypeArguments()[0];
        }
    
        @Override
        public void save(T t) {
            getHibernateTemplate().save(t);
        }
    
        @Override
        public void delte(T t) {
            getHibernateTemplate().delete(t);
        }
        
        @Override
        //通过id删除========>>先取出来对象t,再删除
        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, id);
        }
    
        @Override
        public Integer getTotalCount(DetachedCriteria dc) {
            dc.setProjection(Projections.rowCount());
            List<Long> count = (List<Long>) getHibernateTemplate().findByCriteria(dc);
            if(count!=null&&count.size()>0){
                return count.get(0).intValue();
            }else{
                return null;
            }
        }
    
        @Override
        public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
            List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
            return list;
        }
    
    }

    应用场景(代码展示):

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

    注意:实现CustomerDao接口是为了因为CustomerDao中含有的方法,通过继承BaseDaoImpl来实现CustomerDao中方法的实现。

    附注:确定泛型T的类型

        private Class clazz;//用于接收运行期泛型类型
      
        public BaseDaoImpl() {
            //获得当前类型的带有泛型类型的父类 ----->当前运行的是*Dao(如CustomerDao),它的父类为BaseDao
            ParameterizedType ptclass = (ParameterizedType) this.getClass().getGenericSuperclass();
            //获得运行期的泛型类型
            clazz = (Class) ptclass.getActualTypeArguments()[0];
        }
  • 相关阅读:
    PHP实现4种排序算法
    PHP反射获取当前函数的内容
    PHP递归目录的5种方法
    生成随机数组
    empty、isset、is_null的比较
    PHP哈希表碰撞攻击
    XMLHttpRequest的跨域请求
    CI框架SESSION重写
    PHP开发第一个扩展
    PHP面试题集之基础题
  • 原文地址:https://www.cnblogs.com/empcl1314/p/7510448.html
Copyright © 2020-2023  润新知