通用的DAO,运用泛型

方式一:构造方法中传入一个Class

1、通用的DAO的接口

package com.itheima.crm.dao;

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

import org.hibernate.criterion.DetachedCriteria;

/**
 * 通用DAO的接口
 * @author tycoon
 *
 */
public interface BaseDao {

	public void save(T t);
	
	public void update(T t);
	
	public void delete(T t);
	
	public T findById(Serializable id);
	
	//查询所有
	public List findAll();
	
	//统计个数
	public Integer findCount(DetachedCriteria detachedCriteria);
	
	//分页查询
	public List findByPage(DetachedCriteria detachedCriteria,Integer begin,Integer pageSize);
}

2、通用的DAO的实现类

package com.itheima.crm.dao.impl;

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

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.itheima.crm.dao.BaseDao;

public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {

	private Class clazz;
	//提供构造方法,在构造方法中传入具体的类型的class
	public BaseDaoImpl(Class clazz){
		this.clazz=clazz;
	}
	
	@Override
	public void save(T t) {
		
		this.getHibernateTemplate().save(t);
	}

	@Override
	public void update(T t) {
		
		this.getHibernateTemplate().update(t);;
	}

	@Override
	public void delete(T t) {
		
		this.getHibernateTemplate().delete(t);
	}

	@Override
	public T findById(Serializable id) {
		
		return (T) this.getHibernateTemplate().get(clazz,id);
	}

	@Override
	//查询所有
	public List findAll() {
		
		return (List) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
	}

	@Override
	//统计个数
	public Integer findCount(DetachedCriteria detachedCriteria) {
		//设置统计个数的条件
		detachedCriteria.setProjection(Projections.rowCount());
		List list=(List) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if(list.size()>0){
			list.get(0).intValue();
		}
		return null;
	}

	@Override
	//分页查询
	public List findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		
		return (List) this.getHibernateTemplate().findByCriteria(detachedCriteria,begin,pageSize);
	}

}

 

方式二:通过泛型的反射抽取通用的DAO

package com.itheima.crm.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;

import com.itheima.crm.dao.BaseDao;

public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {

	private Class clazz;
	//提供构造方法,在构造方法中传入具体的类型的class
	/**
	 * 不想子类上有构造方法,必须在父类中提供午餐的构造,在无参构造中获得具体类型的Class
	 *具体类型的Class是参数类型中的实际类型参数
	 */
	public BaseDaoImpl(){
		//反射:第一步获得Class
		Class clazz=this.getClass();//正在被调用的类的Class
		//查看JDK的API里的Class的方法
		Type type=clazz.getGenericSuperclass();//参数化类型:BaseDaoImpl...
		//得到这个type就是一个参数化的类型,将type强转成参数化的类型
		ParameterizedType pType=(ParameterizedType) type;
		//通过参数化类型获得实际类型参数:
		Type[] types=pType.getActualTypeArguments();
		//只获得第一个实际类型参数即可。
		this.clazz=(Class)types[0];//
	}
	
	
	
	
	@Override
	public void save(T t) {
		
		this.getHibernateTemplate().save(t);
	}

	@Override
	public void update(T t) {
		
		this.getHibernateTemplate().update(t);;
	}

	@Override
	public void delete(T t) {
		
		this.getHibernateTemplate().delete(t);
	}

	@Override
	public T findById(Serializable id) {
		
		return (T) this.getHibernateTemplate().get(clazz,id);
	}

	@Override
	//查询所有
	public List findAll() {
		
		return (List) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
	}

	@Override
	//统计个数
	public Integer findCount(DetachedCriteria detachedCriteria) {
		//设置统计个数的条件
		detachedCriteria.setProjection(Projections.rowCount());
		List list=(List) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if(list.size()>0){
			list.get(0).intValue();
		}
		return null;
	}

	@Override
	//分页查询
	public List findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		
		return (List) this.getHibernateTemplate().findByCriteria(detachedCriteria,begin,pageSize);
	}

}

 

你可能感兴趣的:(通用的DAO,运用泛型)