基于Hibernate的dao层抽取,依赖PageBean

分页工具类PageBean

package com.hao.mybos.utils;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

public class PageBean<T> {
    //当前页
    private Integer currentPage;
    //每页记录数
    private Integer pageSize;
    //总记录数
    private Integer totalCount;
    //总页数
    private Integer totalPage;
    //开始索引
    private Integer startIndex; 
    //数据
    private List<T> data;
    //离线查询对象
    private DetachedCriteria dc;
    
    public PageBean(Integer currentPage, Integer pageSize, Integer totalCount){
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
        doCalculate();
    }
    
    /**
     * 更新计算的信息,用于调用set方法后
     */
    public void doCalculate(){
        if(this.currentPage == null){
            //如页面没有指定显示那一页.显示第一页.
            this.currentPage = 1;
        }
        
        if(this.pageSize == null){
            //如果每页显示条数没有指定,默认每页显示3条
            this.pageSize = 3;
        }
        
        this.totalPage = (totalCount-1)/pageSize + 1;
        
        //判断当前页数是否超出范围
        //不能小于1
        if(this.currentPage < 1){
            this.currentPage = 1;
        }
        //不能大于总页数
        if(this.currentPage > this.totalPage){
            this.currentPage = this.totalPage;
        }
        
        //根据当前页和每页显示条数计算起始索引
        this.startIndex = (currentPage-1) * pageSize;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    public DetachedCriteria getDc() {
        return dc;
    }

    public void setDc(DetachedCriteria dc) {
        this.dc = dc;
    }
}
View Code

BaseDao接口

package com.hao.mybos.dao;

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

import org.hibernate.criterion.DetachedCriteria;

import com.hao.mybos.utils.PageBean;

public interface BaseDao<T> {
   
    //基本操作
    
    /**
     * 保存实体
     * @param entity
     */
    void save(T entity);
    
    
    /**
     * 删除实体
     * @param entity
     */
    void delete(T entity);
    
    
    /**
     * 根据实体Id删除实体
     * @param id
     */
    void deleteById(Serializable id);
    
    
    /**
     * 更新实体信息
     * @param entity
     */
    void update(T entity);
    
    
    /**
     * 保存或更新实体
     * @param entity
     */
    void saveOrUpdate(T entity);
    
    
    /**
     * 根据Id查询实体
     * @param id
     * @return
     */
    T findById(Serializable id);
    
    
    /**
     * 根据离线查询对象执行查询
     * @param detachedCriteria
     * @return
     */
    public List<T> findByCriteria(DetachedCriteria dc);
    
    
    /**
     * 查询所有实体信息
     * @return
     */
    List<T> list();
    
    
    //分页查询相关
    
    /**
     * 查询实体的总数
     * @param dc
     * @return
     */
    Integer getTotalCount(DetachedCriteria dc);
    
    /**
     * 分页查询实体,结合上面的查询实体总数使用,更加通用
     * @param dc 离线查询条件
     * @param start 查询起始下标
     * @param pageSize 每页的记录条数
     * @return
     */
    List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
    
    /**
     * 基于PageBean的分页查询,依赖PageBean实体
     * @param pageBean 查询实体,其中含有离线查询对象DC
     */
    void pageQuery(PageBean<T> pageBean);
    
    
    //其他便捷操作
    
    /**
     * 使用hbm中自定义的基于HQL的查询名称进行部分列的更新
     * @param queryName 
     * @param objects 待更新的列的值
     */
    void executeUpdate(String queryName, Object... objects);
}
View Code

BaseDaoImpl实现类

package com.hao.mybos.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.hao.mybos.utils.PageBean;

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{

    public void save(T entity) {
        getHibernateTemplate().save(entity);
    }

    public void delete(T entity) {
        getHibernateTemplate().delete(entity);
    }

    public void deleteById(Serializable id) {
        T entity = getHibernateTemplate().load(entityClass, id);
        getHibernateTemplate().delete(entity);
    }

    public void update(T entity) {
        getHibernateTemplate().delete(entity);
    }

    public void saveOrUpdate(T entity) {
        getHibernateTemplate().saveOrUpdate(entity);
    }

    public T findById(Serializable id) {
        return getHibernateTemplate().get(entityClass, id);
    }

    public List<T> findByCriteria(DetachedCriteria dc) {
         @SuppressWarnings("unchecked")
        List<T> res = (List<T>) getHibernateTemplate().findByCriteria(dc);
        return res;
    }

    public List<T> list() {
        return getHibernateTemplate().loadAll(entityClass);
    }

    public Integer getTotalCount(DetachedCriteria dc) {
        //设置查询的聚合函数
        dc.setProjection(Projections.rowCount());
        @SuppressWarnings("unchecked")
        List<Long> idList = (List<Long>) getHibernateTemplate().findByCriteria(dc);
        //清空之前设置的聚合函数
        dc.setProjection(null);
        if(idList!=null && idList.size()>0){
            Long count = idList.get(0);
            return count.intValue();
        }else{
            return null;
        }
    }

    public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
        dc.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
        @SuppressWarnings("unchecked")
        List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
        return list;
    }

    @SuppressWarnings("unchecked")
    public void pageQuery(PageBean<T> pageBean) {
        DetachedCriteria dc = pageBean.getDc();
        
        //指定Hibernate框架发出sql的形式 - 查询记录总数
        dc.setProjection(Projections.rowCount());
        List<Long> countList = (List<Long>) getHibernateTemplate().findByCriteria(dc);
        Long count = countList.get(0);
        pageBean.setTotalCount(count.intValue());
        //更新信息
        pageBean.doCalculate();
        
        //清空指定的查询记录数,以进行分页查询
        dc.setProjection(null);
        //指定Hibernate封装对象的方式:涉及多表查询时,以查询的目标实体类型返回
        dc.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
        List<T> rows = (List<T>) getHibernateTemplate().findByCriteria(dc,pageBean.getStartIndex(),pageBean.getPageSize());
        pageBean.setData(rows);
        
    }

    public void executeUpdate(String queryName, Object... objects) {
        Session session = this.getSessionFactory().getCurrentSession();
        //根据定义的查询名称创建对应的Query对象
        Query query = session.getNamedQuery(queryName);
        //为HQL中的占位符赋值
        int index = 0;
        for (Object object : objects) {
            query.setParameter(index++, object);
        }
        //执行更新
        query.executeUpdate();
    }
    
    private Class<T> entityClass;
    
    @SuppressWarnings("unchecked")
    public BaseDaoImpl() {
        // 获取子类对象的父类类型
        ParameterizedType superClass = (ParameterizedType) this.getClass()
                .getGenericSuperclass();
        // 获得在父类类型上声明的泛型数组
        Type[] genericTypes = superClass.getActualTypeArguments();
        // 第一个泛型即为实体类型
        entityClass = (Class<T>) genericTypes[0];
    }
    
    @Autowired
    public void setSF(SessionFactory sessionFactory){
        setSessionFactory(sessionFactory);
    }

}
View Code
原文地址:https://www.cnblogs.com/tommychok/p/7357894.html