04抽取接口到一个接口内,实现接口到一个实现类中

04抽取接口到一个接口内,实现接口到一个实现类中_第1张图片

04抽取接口到一个接口内,实现接口到一个实现类中_第2张图片
用SVN将项目更新

BaseDao

package cn.itcast.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

public interface BaseDao 
{
    //增
    void save(T t);
    //删
    void delete(T t);
    //删
    void delete(Serializable id);
    //改
    void update(T t);
    //8大基本类型的包装类  & String类型都实现类Serializable接口
    //id用Serializable, 覆盖了所有的id类型
    //查 根据id查询-返回一个对象
     T  getById(Serializable id);
    
    //查-查符合条件的总记录数
    Integer getTotalCount(DetachedCriteria dc);
    
    //查-查询分页列表--也要让别的对象使用
    List getPageList(DetachedCriteria dc,Integer start,Integer pageSize);
    
}

BaseDaoImpl

package cn.itcast.dao.impl;

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 extends HibernateDaoSupport implements BaseDao
{
    private Class clazz;//用于接收运行期的泛型类型

    public BaseDaoImpl()
    {
        //获得当前带有泛型类型的父类
        ParameterizedType  ptClass= (ParameterizedType) this.getClass().getGenericSuperclass();
        //它运行在CustomerDao,但是是获得的是BaseDaoImpl的泛型类型
        /*
         * public interface Type {
            }
            标识性接口
            反射技术中的顶层接口

         */
        //获得运行期的泛型类型
        clazz = (Class) ptClass.getActualTypeArguments()[0];//BaseDaoImpl里面只有一个泛型
    }

    @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)
    {
        //如何获得运行时期泛型的类型?
        //生成一个 BaseDaoImpl的构造方法,利用它来返回
        
        return (T) getHibernateTemplate().get(clazz, id);
    
        
    }

    @Override
    public Integer getTotalCount(DetachedCriteria dc)
    {
                //查询总记录数
                //利用HibernateTemplate来做
                //设置查询的聚合函数,总记录数
                dc.setProjection(Projections.rowCount());
                
                List list = (List) 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 getPageList(DetachedCriteria dc, Integer start, Integer pageSize)
    {
        List list=(List) getHibernateTemplate().findByCriteria( dc, start, pageSize);
        return list;
    }
    
    

    

}

你可能感兴趣的:(04抽取接口到一个接口内,实现接口到一个实现类中)