zoukankan      html  css  js  c++  java
  • 基于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
  • 相关阅读:
    哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)
    ACM_X章求和(数学)
    goj 扫雷(dfs)
    Sereja and Brackets(括号匹配)
    NOIP模拟赛 迷路
    NOIP模拟赛three(3)
    NOIP模拟赛2(two)
    NOIP模拟赛1(one)
    czy的后宫5
    [BZOJ3436]小K的农场
  • 原文地址:https://www.cnblogs.com/tommychok/p/7357894.html
Copyright © 2011-2022 走看看