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

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

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

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

GoodsAction:

  1. public class GoodsAction extends ActionSupport implements ModelDriven<Goods>,ServletRequestAware{
  2.  
  3. private GoodsService goodsService;
  4. private Goods goods=new Goods();
  5. HttpServletRequest request;
  6.  
  7. private int page;
  8. /**
  9. * 展示所有商品
  10. * @return
  11. */
  12. public String showAll(){
  13. //List<Goods> gList=goodsService.findAll();
  14. PageBean<Goods> pagebean=goodsService.findByPage(page);
  15. ActionContext.getContext().getValueStack().set("pageBean", pagebean);
  16. return "findAll_succ";
  17. }
  18.  
  19. public void setGoodsService(GoodsService goodsService) {
  20. this.goodsService = goodsService;
  21. }
  22.  
  23. @Override
  24. public Goods getModel() {
  25. return goods;
  26. }
  27.  
  28. @Override
  29. public void setServletRequest(HttpServletRequest request) {
  30. this.request=request;
  31. }
  32. public void setPage(int page) {
  33. this.page = page;
  34. }
  35. public int getPage() {
  36. return page;
  37. }
  38. }

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

下面是GoodsService:

  1. package com.wang.shop.goods.service;
  2. import java.util.List;
  3. import com.wang.shop.goods.dao.GoodsDao;
  4. import com.wang.shop.goods.entity.Goods;
  5. import com.wang.shop.util.PageBean;
  6.  
  7. public class GoodsService {
  8.  
  9. private GoodsDao goodsDao;
  10.  
  11. public void setGoodsDao(GoodsDao goodsDao) {
  12. this.goodsDao = goodsDao;
  13. }
  14.  
  15. public PageBean<Goods> findByPage(int page) {
  16. PageBean<Goods> pageBean =new PageBean<Goods>();
  17. pageBean.setPage(page);
  18. int limit=4;
  19. pageBean.setLimit(limit);
  20. int totalCount=goodsDao.findTotalCount();
  21. pageBean.setTotalCount(totalCount);
  22. int totalpage=(int)Math.ceil(totalCount/limit);
  23. pageBean.setTotalPage(totalpage);
  24. //每页显示的数据集合
  25. int begin=(page-1)*limit;
  26. List<Goods> list=goodsDao.findByPageId(begin,limit);
  27. pageBean.setList(list);
  28. return pageBean;
  29. }
  30.  
  31. }

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

GoodsDao:

  1. package com.wang.shop.goods.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.orm.hibernate4.HibernateCallback;
  6. import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
  7.  
  8. import com.wang.shop.goods.entity.Goods;
  9. import com.wang.shop.util.PageHibernateCallback;
  10.  
  11. public class GoodsDao extends HibernateDaoSupport{
  12.  
  13. public List<Goods> findAll() {
  14. List<Goods> list=(List<Goods>) this.getHibernateTemplate().find("from Goods");
  15.  
  16. return list;
  17. }
  18.  
  19. public Goods findById(int goodsId) {
  20. Goods goods=this.getHibernateTemplate().get(Goods.class, goodsId);
  21. return goods;
  22. }
  23. //查询goods表中总记录数
  24. public int findTotalCount() {
  25. String hql="select count(*) from Goods";
  26. List<Long> list=(List<Long>) this.getHibernateTemplate().find(hql);
  27. if(list!=null&&list.size()>0){
  28. return list.get(0).intValue();
  29. }
  30. return 0;
  31. }
  32.  
  33. //查询当前页面的商品集合
  34. public List<Goods> findByPageId(int begin, int limit) {
  35. String hql="from Goods";
  36. List<Goods> list=(List<Goods>) this.getHibernateTemplate().execute((HibernateCallback<Goods>) new PageHibernateCallback(hql, new Object[]{}, begin, limit));
  37. if(list!=null&&list.size()>0){
  38.  
  39. return list;
  40. }
  41. return null;
  42. }
  43.  
  44. }

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

PageHibernateCallback:

  1. package com.wang.shop.util;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.List;
  5.  
  6. import org.hibernate.HibernateException;
  7. import org.hibernate.Query;
  8. import org.hibernate.Session;
  9. import org.springframework.orm.hibernate4.HibernateCallback;
  10.  
  11. public class PageHibernateCallback<T> implements HibernateCallback<List<T>>{
  12.  
  13. private String hql;
  14. private Object[] params;
  15. private int startIndex;
  16. private int pageSize;
  17.  
  18. public PageHibernateCallback(String hql, Object[] params,
  19. int startIndex, int pageSize) {
  20. super();
  21. this.hql = hql;
  22. this.params = params;
  23. this.startIndex = startIndex;
  24. this.pageSize = pageSize;
  25. }
  26.  
  27. public List<T> doInHibernate(Session session) throws HibernateException {
  28. Query query = session.createQuery(hql);
  29.  
  30. if(params != null){
  31. for(int i = 0 ; i < params.length ; i ++){
  32. query.setParameter(i, params[i]);
  33. }
  34. }
  35.  
  36. query.setFirstResult(startIndex);
  37. query.setMaxResults(pageSize);
  38.  
  39. return query.list();
  40. }
  41.  
  42. }

  上面代码的构造方法中的第二个参数是一个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. 使用pip安装BeautifulSoup4模块

    1.测试是否安装了BeautifulSoup4模块 import bs4 print bs4 执行报错说明没有安装该模块 Traceback (most recent call last): File ...

  2. Skyshop: Image-Based Lighting Tools & Shaders插件调整反射光不明显的模型

    在Skyshop插件中,使用类似不锈钢等材质的模型,实时反光效果非常好,如果是其他反光不明显的模型,如砖头,建筑等,这时候就需要调整模型的Shader的高光贴图了. 如官方例子中的用砖块组成的柱子,反 ...

  3. 关于ScrollView嵌套ListView问题

    Android开发之ScrollView中嵌套ListView的解决方案   原文:http://blog.csdn.net/minimicall/article/details/40983331   ...

  4. 在服务器上启用HTTPS的详细教程

    现在,你应该能在访问https://konklone.com的时候,在地址栏里看到一个漂亮的小绿锁了,因为我把这个网站换成了HTTPS协议.一分钱没花就搞定了. 为什么要使用HTTPS协议: 虽然SS ...

  5. Powershell 字符串处理案例

    有一张Excel表格收集了计算机名和IP地址,另外一张表有计算机名,需要找出这张表中计算机名对应的IP地址. #定义函数Get-LikeContentInfo function Get-LikeCon ...

  6. Mongodb 学习笔记

    Mongo DB NoSql简介 MongoDB简介 在Windows平台下安装Mongo Mongo DB官方文档 MongoDB基本命令 MongoDB的默认安装路径为 C:\Program Fi ...

  7. 模糊测试(fuzz testing)介绍(一)

    模糊测试(fuzz testing)是一类安全性测试的方法.说起安全性测试,大部分人头脑中浮现出的可能是一个标准的“黑客”场景:某个不修边幅.脸色苍白的年轻人,坐在黑暗的房间中,正在熟练地使用各种工具 ...

  8. C语言 · 出现次数最多的数

    问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两 ...

  9. iOS-Xcode使用技巧

    一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编 ...

  10. Package Configurations的使用示例

    SSIS提供Package Configurations功能,能够动态修改配置数据,使package执行不同的变量,从不同的connection中获取数据,而这些变化,不需要修改Package,不需要 ...