为什么要抽取通用DAO
- 因为在DAO中有一些CURD的代码都是类似的,所以可以抽取出来
怎么抽取通用DAO
- 先编写一个BaseDao< T>的接口,将所有需要抽取的方法写在里面
- 在编写一个实现类BaseDaoImpl< T>, 这个实现类需要继承HibernateDaoSupport类,并且实现BaseDao< T>接口
- 我们就可以在BaseDaoImpl中写那些重复的方法,不过具体的类都是以泛型来代替的
- 在具体的Dao中,我们就可以继承BaseDaoImpl< T>这个类,并将具体的类传入到BaseDaoImpl中去,就可以使用那些方法啦
具体的实现
BaseDao
public interface BaseDao<T> {
public void save(T t);
public void update(T t);
public void delete(T t);
public T findById(Serializable id);
public Integer findCount(DetachedCriteria detachedCriteria);
public List<T> findByPage(DetachedCriteria detachedCriteria,Integer curPage,Integer pageSize);
public List<T> findAll();
}
BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
// private Class clazz;
// 通过构造方法传递一个Class对象:
// public BaseDaoImpl(Class clazz) {
// this.clazz = clazz;
// }
Class entityClass;
public BaseDaoImpl(){
// 只要加载spring容器,就会创建每个Dao的子类,通过子类调用父类,执行父类的构造方法
Class childClass = this.getClass(); // CustomerDaoImpl<Customer>
Type type = childClass.getGenericSuperclass(); // BaseDaoImpl<Customer>
ParameterizedType parameterizedType = (ParameterizedType)type; // BaseDaoImpl<Customer>
entityClass = (Class) parameterizedType.getActualTypeArguments()[0]; //Customer
}
@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) {
T model = (T)this.getHibernateTemplate().get(entityClass, id);
return model;
}
@Override
public Integer findCount(DetachedCriteria detachedCriteria) {
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
if(list.size()>0){
return list.get(0).intValue();
}
return null;
}
@Override
public List<T> findByPage(DetachedCriteria detachedCriteria, Integer curPage, Integer pageSize) {
detachedCriteria.setProjection(null);
int begin = (curPage-1)*pageSize;
List<T> list = (List<T>)this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
return list;
}
@Override
public List<T> findAll() {
List<T> list = (List<T>) this.getHibernateTemplate().find("from "+this.entityClass.getSimpleName());
return list;
}
}