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

小编 2026-07-14 阅读:1403 评论:0
  在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了...

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

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表