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

来源:互联网 发布:哪里查非农数据 编辑:程序博客网 时间:2024/05/16 09:31

  在进行大量的数据展示时,必须要使用分页查询,第一次使用在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[]{}.

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

0 0