对数据库访问的基类

引入:各个类对数据库的访问基本上都包含了增删改查几大部分。因为基本上都包含这几大部分,如果每个类都写,势必会造成代码量的冗余。再次,我们将各个类都具有的增删改查,具体到一个基类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];
    }
原文地址:https://www.cnblogs.com/empcl1314/p/7510448.html