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[]{}.

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

时间: 2025-01-01 21:35:52

ssh整合问题总结--使用HibernateTemplate实现数据分页展示的相关文章

ssh整合(dao使用hibernateTemplate)

数据分页展示

package cn.gzsxt.util; import java.util.List; /** * 分页封装 */public class PageUtil { /** * 1 数据里面的数据总行数 */ private int rowcount;// 数据里面的数据总行数 /** * 2 一页多少行数据 */ private int pagesize=10;// 一页多少行数据 /** * 3 查询起始行 limit startrow,pagesize; */ private int st

angulatJs 前端数据分页展示——例

注:css用的是amazeui html: ···<div style="height:500px;overflow: auto;"> <table class="am-table" style="width:100%;padding: 10px 30px "> <tr> <td>序号</td> <td>姓名</td> <td>电话</td>

SSH整合(配置方式)

工程目录: /SSH1/src/cn/itcast/domain/Book.java package cn.itcast.domain; /** * 图书 */ public class Book { private Integer id; // 图书编号 private String name; // 图书名称 private Double price; // 图书价格 public Integer getId() { return id; } public void setId(Intege

mysql+ssh整合例子,附源码下载

项目引用jar下载:http://download.csdn.net/detail/adam_zs/7262727 项目源码下载地址:http://download.csdn.net/detail/adam_zs/7262749 今天花时间把ssh整合了一下,重新再学习一下,希望对大家有所帮助! 我用的是mysql数据库,建表语句比较简单就不贴出来了,建表的时候记的设置id为自动增加哦. 项目文件位置,项目引用jar包 项目配置文件 web.xml <?xml version="1.0&q

ssh整合常见的后台错误

ssh整合以及常见的后台错误 摘自网络 jsp和Servlet之间传值出现乱码的解决方案 采用设置字符集的方式 request.setCharacterEncoding("utf-8"); 在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8 <filter> <filter-name>encodingFilter</filter-name> <filter-class>fengke.filter.CoreF

mysql+ssh整合样例,附源代码下载

项目引用jar下载:http://download.csdn.net/detail/adam_zs/7262727 项目源代码下载地址:http://download.csdn.net/detail/adam_zs/7262749 今天花时间把ssh整合了一下,又一次再学习一下,希望对大家有所帮助! 我用的是mysql数据库,建表语句比較简单就不贴出来了,建表的时候记的设置id为自己主动添加?哦. 项目文件位置,项目引用jar包 项目配置文件 web.xml <?xml version="

使用注解实现ssh整合

1.搭建项目: 项目名称:ss12.添加jar包    1).struts 2.3.7         --基础        asm-3.3.jar        asm-commons-3.3.jar        asm-tree-3.3.jar        commons-fileupload-1.2.2.jar        commons-io-2.0.1.jar        commons-lang3-3.1.jar        freemarker-2.3.19.jar  

框架 day37 Spring事务管理,整合web,SSH整合,SSH整合注解

1     事务管理 1.1   回顾事务     事务:一组业务操作,要么全部成功,要么全部不成功.     事务特性:ACID 原子性:整体 一致性:数据(完整) 隔离性:并发(多个事务) 持久性:结果     隔离问题:脏读.不可重复读.幻读(虚读)     隔离级别:4个 readuncommitted 读未提交,存在3个问题. readcommitted 读已提交,解决:脏读:存在2个. repeatableread 可重复读,解决:脏读.不可重复读:存在1个 serializ