BaseDao
package cn.itcast.dao;
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);
//8大基本类型的包装类 & String类型都实现类Serializable接口
//id用Serializable, 覆盖了所有的id类型
//查 根据id查询-返回一个对象
T getById(Serializable id);
//查-查符合条件的总记录数
Integer getTotalCount(DetachedCriteria dc);
//查-查询分页列表--也要让别的对象使用
List<T> 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<T> extends HibernateDaoSupport implements BaseDao<T>
{
private Class clazz;//用于接收运行期的泛型类型
public BaseDaoImpl()
{
//获得当前带有泛型类型的父类
ParameterizedType ptClass= (ParameterizedType) this.getClass().getGenericSuperclass();
//它运行在CustomerDao,但是是获得的是BaseDaoImpl的泛型类型
/*
* public interface Type {
}
标识性接口
反射技术中的顶层接口
*/
//获得运行期的泛型类型
clazz = (Class) ptClass.getActualTypeArguments()[0];//BaseDaoImpl<T>里面只有一个泛型
}
@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<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> list=(List<T>) getHibernateTemplate().findByCriteria( dc, start, pageSize);
return list;
}
}