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

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

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

  1. js静态数据分页展示

    拿vue做示例 首先定义data data() { return { tableData: [], // 当前页的数据,用于给表格展示用的 tableDataAll: [], // 需要拿来分页的总数 ...

  2. SSH整合,"sessionFactory " or "hibernateTemplate " is required异常

    首先遇到的问题就是HibernateDaoSupport引起的,程序中所有的DAO都继承自HibernateDaoSupport,而HibernateDaoSupport需要注入sessionfact ...

  3. ssh整合(dao使用hibernateTemplate)

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

    注:css用的是amazeui html: ···<div style="height:500px;overflow: auto;"> <table class= ...

  5. Antd 表格数据分页展示

    分页组件代码 render(){ const {total,size,currenPage} = this.state // 参数分别为数据总条数.每页数据条数.当前页页码 return ( // 渲 ...

  6. vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)

    文章目录 1.看实现的效果 2.前端vue页面核心代码 2.1. 表格代码(表格样式可以去elementui组件库直接调用相应的) 2.2.分页组件代码 2.3 .script中的代码 3.后端核心代 ...

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

    项目引用jar下载:http://download.csdn.net/detail/adam_zs/7262727 项目源代码下载地址:http://download.csdn.net/detail/ ...

  8. ssh整合开发

    ssh整合思想 ssh整合 第一步:导入ssh相关jar包 第二步:搭建struts环境   (1)创建 action  struts.xml配置文件, 配置action struts.xml约束 & ...

  9. Spring第四天——SSH整合

    (从整合开始,使用回归使用eclipse) 一.三大框架版本:  struts2 hibernate5 spring4 二.SSH三大框架回顾: Hibernate: ORM思想 核心配置文件: 单独 ...

随机推荐

  1. liunx常用的命令

    计算机网络的主要优点是能够实现资源和信息的共享,并且用户可以远程访问信息.Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户登录到远程计算机上.传输文件和执行远程命令等. 本章介绍 ...

  2. jqueryui 进度条使用

    <title></title> <script src="../Js/NewJs_CFJ/jquery.js" type="text/jav ...

  3. composer安装

    1.首先到php.net下载对应版本的php,zip版本即可,注意windows需要vc11运行库支持 2.配置path路径添加对php解压目录的引用 3.将php.ini-development  ...

  4. IT人士必去的10个网站

    1.Chinaunix 网址:http://www.chinaunix.net/ 简介:中国最大的linux/unix技术社区. 2.ITPub 网址:http://www.itpub.net/ 简介 ...

  5. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

    一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...

  6. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  7. 七天学会ASP.NET MVC (四)——用户授权认证问题

    小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...

  8. Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门

    前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...

  9. 单页面实现之hash

    至学了angularJs后,发现这个单页面应用不知道在没有angularJs的情况下怎么实现. 所以就此对这个思考与资料并行,终于知道这个的实现基本原理. 首先angularJs的实现是hash值的变 ...

  10. WaitType:ASYNC_NETWORK_IO

    官方文档的定义,是指SQL Server 产生的结果集需要经过Network传递到Client,Network不能很快将结果集传输到Client,导致结果集仍然驻留在SQL Server的Sessio ...