抽取通用的DAO

为什么要抽取通用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;
    }


}

猜你喜欢

转载自blog.csdn.net/lr19941226/article/details/80877384