• ssh整合问题总结--使用HibernateTemplate实现数据分页展示


      在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完成数据的分页查询.

      在utils包下新建一个pageBean(这个实体类用于封装当前页面的数据集合,以及和page相关的参数):

    public class PageBean<T> {
    
        private int page;//当前页数
        private int totalCount;//总记录数
        private int totalPage;//总页数(总记录数/每页记录数)
        private int limit;//每页记录数
        private List<T> list;//包含商品的集合
    //set/get方法省略
    }

    在我的案例中,在页面中,当点击"全部商品"时,会跳入到(商品的action类)GoodsAction,并且传入一个参数page,默认为1.

    GoodsAction:

    public class GoodsAction extends ActionSupport implements ModelDriven<Goods>,ServletRequestAware{
    
        private GoodsService goodsService;
        private Goods goods=new Goods();
        HttpServletRequest request;
        
        private int page;
        /**
         * 展示所有商品
         * @return
         */
        public String showAll(){
            //List<Goods> gList=goodsService.findAll();
            PageBean<Goods> pagebean=goodsService.findByPage(page);
            ActionContext.getContext().getValueStack().set("pageBean", pagebean);
            return "findAll_succ";
        }
        
        public void setGoodsService(GoodsService goodsService) {
            this.goodsService = goodsService;
        }
    
    
        @Override
        public Goods getModel() {
            return goods;
        }
    
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request=request;
        }
        public void setPage(int page) {
            this.page = page;
        }
        public int getPage() {
            return page;
        }
    }

    在action,需要返回得到pageBean的所有私有成员的信息,并且设置到值栈(ValueStack)栈顶,以供页面回显调用.

    下面是GoodsService:

    package com.wang.shop.goods.service;
    import java.util.List;
    import com.wang.shop.goods.dao.GoodsDao;
    import com.wang.shop.goods.entity.Goods;
    import com.wang.shop.util.PageBean;
    
    public class GoodsService {
    
        private GoodsDao goodsDao;
        
        public void setGoodsDao(GoodsDao goodsDao) {
            this.goodsDao = goodsDao;
        }
    
        public PageBean<Goods> findByPage(int page) {
            PageBean<Goods> pageBean =new PageBean<Goods>();
            pageBean.setPage(page);
            int limit=4;
            pageBean.setLimit(limit);
            int totalCount=goodsDao.findTotalCount();
            pageBean.setTotalCount(totalCount);
            int totalpage=(int)Math.ceil(totalCount/limit);
            pageBean.setTotalPage(totalpage);
            //每页显示的数据集合
            int begin=(page-1)*limit;
            List<Goods> list=goodsDao.findByPageId(begin,limit);
            pageBean.setList(list);
            return pageBean;
        }
        
    }

    在service中,设置pageBean的每个属性,可以得到的直接设置,得不到的去Dao层中进行数据库查询.

    GoodsDao:

    package com.wang.shop.goods.dao;
    
    import java.util.List;
    
    import org.springframework.orm.hibernate4.HibernateCallback;
    import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
    
    import com.wang.shop.goods.entity.Goods;
    import com.wang.shop.util.PageHibernateCallback;
    
    public class GoodsDao extends HibernateDaoSupport{
    
        public List<Goods> findAll() {
            List<Goods> list=(List<Goods>) this.getHibernateTemplate().find("from Goods");
            
            return list;
        }
    
        public Goods findById(int goodsId) {
            Goods goods=this.getHibernateTemplate().get(Goods.class, goodsId);
            return goods;
        }
         //查询goods表中总记录数
        public int findTotalCount() {
            String hql="select count(*) from Goods";
            List<Long> list=(List<Long>) this.getHibernateTemplate().find(hql);
            if(list!=null&&list.size()>0){
                return list.get(0).intValue();
            }
            return 0;
        }
    
        //查询当前页面的商品集合
        public List<Goods> findByPageId(int begin, int limit) {
            String hql="from Goods";
            List<Goods> list=(List<Goods>) this.getHibernateTemplate().execute((HibernateCallback<Goods>) new PageHibernateCallback(hql, new Object[]{}, begin, limit));
            if(list!=null&&list.size()>0){
                
                return list;
            }
            return null;
        }
    
    }

    注意这里我用到了一个PageHibernateCallback类,通常情况下,我们会写一个HibernateCallBack的匿名内部类,然后在里边写相关代码,为了代码复用,这里重新写了一个类来实现HibernateCallback接口,再通过泛型依赖注入,就可以得到一个工具类了.下面是代码.

    PageHibernateCallback:

    package com.wang.shop.util;
    
    import java.sql.SQLException;
    import java.util.List;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.springframework.orm.hibernate4.HibernateCallback;
    
    public class PageHibernateCallback<T> implements HibernateCallback<List<T>>{
        
        private String hql;
        private Object[] params;
        private int startIndex;
        private int pageSize;
        
    
        public PageHibernateCallback(String hql, Object[] params,
                int startIndex, int pageSize) {
            super();
            this.hql = hql;
            this.params = params;
            this.startIndex = startIndex;
            this.pageSize = pageSize;
        }
    
    
    
        public List<T> doInHibernate(Session session) throws HibernateException {
            Query query = session.createQuery(hql);
            
            if(params != null){
                for(int i = 0 ; i < params.length ; i ++){
                    query.setParameter(i, params[i]);
                }
            }
            
            query.setFirstResult(startIndex);
            query.setMaxResults(pageSize);
            
            return query.list();
        }
    
    }

      上面代码的构造方法中的第二个参数是一个object类型的数组,用于设置hql语句中的"?",如果你没有这个参数,可以在调用的时候,写为 new Object[]{}.

      以上就可以实现,数据的分页查询了.

  • 相关阅读:
    Windows 配置 allure report 环境
    ruby 异常处理 begin rescue end
    ruby 安装 mysql2 命令
    Linux 新建文件/文件夹,删除文件文件夹,查找文件 打开文件
    Ubuntu 共享 转载
    单元测试框架 unittest 的运行方法if __name__ == '__main__': unittest.main()
    Python 字典和json的本质区别(个人理解)

    接口自动化大致流程。
    iOS开发UI篇—CAlayer(自定义layer)
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5313725.html
Copyright © 2020-2023  润新知