并没有使用pagehelper多表分页进行分页查询,为什么还是调用了

您所在的位置: &
浅谈Struts分页中的Hibernate如何实现
浅谈Struts分页中的Hibernate如何实现
在进行web应用开发的时候经常要进行分页处理,经常看到一些人在问分页处理的问题,现在我把自己的处理方法写在这儿,希望能对需要进行分页处理的朋友有所帮助。
在进行web应用开发的时候经常要对Struts分页处理,经常看到一些人在问Struts分页处理的问题,现在我把自己的处理方法写在这儿,希望能对需要进行Struts分页处理的朋友有所帮助。
一、在Struts分页有两种结构:
1. 在Action中通过DAO查询出所有的记录,然后加到session或request对象中,传到客户端,由JSP进行分页。
这种方法对于在数据量少的时候很方便,也不影响速度。
2.在Action中每次通过DAO只查询出一页的记录,再传给JSP页面。
这种结构对于数据量大的程序很好,但对于数据量小的情况,会增加对服务器的请求,加大服务器的负载。
二、Hibernate查询
由于在Hibernate中直接提供了对数据库定点定量的查询方法,所以我采用的是第2种方法。
从第1万条开始取出100条记录
Query q = session.createQuery("from Cat as c");q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();
三、具体实现
package com.jpcf.db.
import java.math.*;
public class Pager {
private int totalR //总行数
private int pageSize = 10; //每页显示的行数
private int currentP //当前页号
private int totalP //总页数
private int startR //当前页在数据库中的起始行
public Pager() {
public Pager(int _totalRows) {
totalRows = _totalR
totalPages=totalRows/pageS
int mod=totalRows%pageS
if(mod&0){
totalPages++;
currentPage = 1;
startRow = 0;
public int getStartRow() {
return startR
public int getTotalPages() {
return totalP
public int getCurrentPage() {
return currentP
public int getPageSize() {
return pageS
public void setTotalRows(int totalRows) {
this.totalRows = totalR
public void setStartRow(int startRow) {
this.startRow = startR
public void setTotalPages(int totalPages) {
this.totalPages = totalP
public void setCurrentPage(int currentPage) {
this.currentPage = currentP
public void setPageSize(int pageSize) {
this.pageSize = pageS
public int getTotalRows() {
return totalR
public void first() {
currentPage = 1;
startRow = 0;
public void previous() {
if (currentPage == 1) {
currentPage--;
startRow = (currentPage - 1) * pageS
public void next() {
if (currentPage & totalPages) {
currentPage++;
startRow = (currentPage - 1) * pageS
public void last() {
currentPage = totalP
startRow = (currentPage - 1) * pageS
public void refresh(int _currentPage) {
currentPage = _currentP
if (currentPage & totalPages) {
Pager类用于计算首页、前一页、下一页、尾页的在数据库中的起始行,当前的页码。
2.PagerHelp类
package com.jpcf.db.
import javax.servlet.http.*;
public class PagerHelper {
public static Pager getPager(HttpServletRequest httpServletRequest,
int totalRows) {
//定义pager对象,用于传到页面
Pager pager = new Pager(totalRows);
//从Request对象中获取当前页号
String currentPage = httpServletRequest.getParameter("currentPage");
//如果当前页号为空,表示为首次查询该页
//如果不为空,则刷新pager对象,输入当前页号等信息
if (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
//获取当前执行的方法,首页,前一页,后一页,尾页。
String pagerMethod = httpServletRequest.getParameter("pageMethod");
if (pagerMethod != null) {
if (pagerMethod.equals("first")) {
pager.first();
} else if (pagerMethod.equals("previous")) {
pager.previous();
} else if (pagerMethod.equals("next")) {
pager.next();
} else if (pagerMethod.equals("last")) {
pager.last();
PageHelper这个类,我不用说应该也知道用来干嘛了
package com.jpcf.db.
import com.jpcf.db.model.*;
import com.jpcf.db.helper.HibernateU
import net.sf.hibernate.*;
import java.util.*;
import com.jpcf.db.controller.*;
public class VehiclePropertyDAO {
public Collection findWithPage(int pageSize, int startRow) throws
HibernateException {
Collection vehicleList =
Transaction tx =
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Query q = session.createQuery("from VehicleProperty vp");
q.setFirstResult(startRow);
q.setMaxResults(pageSize);
vehicleList = q.list();
} catch (HibernateException he) {
if (tx != null) {
tx.rollback();
} finally {
HibernateUtil.closeSession();
return vehicleL
public int getRows(String query) throws
HibernateException {
int totalRows = 0;
Transaction tx =
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
totalRows = ((Integer) session.iterate(query).next()).
intValue();
} catch (HibernateException he) {
if (tx != null) {
tx.rollback();
} finally {
HibernateUtil.closeSession();
return totalR
DAO类我就贴这些分页需要的代码了。
“from VehicleProperty vp”也可以用一个参数传进来,有兴趣的自己改一下吧
下面是在Action中用到的代码:/
public ActionForward queryWithPage(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletresponse) {
Collection clInfos =//用于输出到页面的记录集合
int totalR//记录总行数
VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();
//取得当前表中的总行数
totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
} catch (Exception ex) {
servlet.log(ex.toString());
return actionMapping.findForward(Constants.FAILURE);
//通过PagerHelper类来获取用于输出到页面的pager对象
Pager pager=PagerHelper.getPager(httpServletRequest,totalRows);
//取出从startRow开始的pageSize行记录
clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow());
} catch (Exception ex) {
servlet.log(ex.toString());
return actionMapping.findForward(Constants.FAILURE);
//把输出的记录集和pager对象保存到request对象中
httpServletRequest.setAttribute("CLINFOS", clInfos);
httpServletRequest.setAttribute("PAGER", pager);
return actionMapping.findForward(Constants.SUCCESS);
查询语句select count(*) from VehicleProperty 也可以换成你需要的任意的条件(select count(*) from VehicleProperty where ..)
5.JSP页面使用
下面就是在JSP中的应用了:&
="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first" paramName="PAGER" paramProperty="currentPage" paramId="currentPage"&首页
解释一下这一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&pageMethod=first
method=queryWithPage 是由于我的Action继承的是DispatchAction,需要一个method参数
pageMethod=first 是用来在PageHelper类中判断执行哪个操作
四、Struts分页总结
我做的这个也只是一个借鉴,还有很多没有实现的,比如还可以加一下 go 直接到第n页的功能。
其实最关键的是把当前页号和要执行的是功能(上一页,下一页)的参数从页面传进来,在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了
2017年行业合并、雾计算等成物联网发展趋势
讲师: 367人学习过讲师: 14人学习过讲师: 50人学习过
你想知道618大促都有哪些技术支撑吗?你想知道京东白
前几天和长辈闲聊之下,“大数据”,竟然也从老人家嘴
刚刚走出校园,打算在求职市场上一展英姿?各位年轻的
本书主要介绍了SQL的数据库应用和开发技术,内容涉及关系数据库和SQL概述,SQL环境,SQL对于数据表的操作,数据库查询知识,SQL
51CTO旗下网站Mybatis分页插件 - PageHelper_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Mybatis分页插件 - PageHelper
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢1、引入jar包
这里以maven为例(如果下载jar,还需要下载pageHelper的依赖com.github.jsqlparser):
&dependency&
&groupId&com.github.pagehelper&/groupId&
&artifactId&pagehelper&/artifactId&
&version&4.1.6&/version&
&/dependency&
2、添加配置
在mybatis的全局配置文件里&configuration&标签下添加下面的配置
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
environments?, databaseIdProvider?, mappers?
&!-- com.github.pagehelper为PageHelper类所在包名 --&
&plugin interceptor=&com.github.pagehelper.PageHelper&&
&!-- 4.0.0以后版本可以不设置该参数 --&
&property name=&dialect& value=&mysql&/&
&!-- 该参数默认为false --&
&!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 --&
&!-- 和startPage中的pageNum效果一样--&
&property name=&offsetAsPageNum& value=&true&/&
&!-- 该参数默认为false --&
&!-- 设置为true时,使用RowBounds分页会进行count查询 --&
&property name=&rowBoundsWithCount& value=&true&/&
&!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 --&
&!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)--&
&property name=&pageSizeZero& value=&true&/&
&!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --&
&!-- 启用合理化时,如果pageNum&1会查询第一页,如果pageNum&pages会查询最后一页 --&
&!-- 禁用合理化时,如果pageNum&1或pageNum&pages会返回空数据 --&
&property name=&reasonable& value=&false&/&
&!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 --&
&!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 --&
&!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 --&
&!-- 不理解该含义的前提下,不要随便复制该配置 --&
&property name=&params& value=&pageNum=pageHelperSpageSize=pageHelperR&/&
&!-- 支持通过Mapper接口参数来传递分页参数 --&
&property name=&supportMethodsArguments& value=&false&/&
&!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page --&
&property name=&returnPageInfo& value=&none&/&
&/plugins&
3、编写代码
下面是Junit单元测试的简单实现分页查询的代码
package com.taotao.PageH
import java.util.ArrayL
import java.util.L
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.junit.T
import org.junit.runner.RunW
import org.mybatis.spring.SqlSessionFactoryB
import org.springframework.beans.factory.annotation.A
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import com.github.pagehelper.P
import com.github.pagehelper.PageH
import com.github.pagehelper.PageI
import com.taotao.mapper.TbItemM
import com.taotao.pojo.TbI
import com.taotao.pojo.TbItemE
import com.taotao.pojo.TbItemExample.C
//自动加载spring容器
@RunWith(SpringJUnit4ClassRunner.class)
// 告诉junit spring的配置文件
@ContextConfiguration({ &classpath:spring/applicationContext-dao.xml&,
&classpath:spring/applicationContext-service.xml& })
public class TestPageHelper {
@Autowired
private TbItemMapper itemM
* 无条件分页查询测试
* @Title:函数 TestPageHelper
* @Description:Comment for non-overriding methods
* @author 张颖辉
* @date 日下午9:54:36
public void TestPageHelper() {
// 执行查询并分页
TbItemExample itemExample = new TbItemExample();
// 分页处理
PageHelper.startPage(2, 10);// 如果没有这行,后面就会取出所有的商品list
// 执行查询语句获取商品列表
List&TbItem& items = itemMapper.selectByExample(itemExample);
// 打印返回的商品列表
for (int i = 0; i & items.size(); i++) {
System.out.println((i + 1) + &:& + items.get(i).getTitle());
// 获取分页信息
PageInfo&TbItem& pageInfo = new PageInfo&TbItem&(items);
long total = pageInfo.getTotal();
System.out.println(&共有商品:& + total);
@Autowired
SqlSessionFactoryBean sqlSessionF
* 条件分页查询测试
* @Title:函数 TestPageHelper2
* @Description:Comment for non-overriding methods
* @author 张颖辉
* @date 日下午9:54:55
* @throws Exception
public void TestPageHelper2() throws Exception {
* 另外一种注入的方式,通过SqlSessionFactoryBean拿到bean(比较落后,已经不常用)
// SqlSessionFactory sessionFactory = sqlSessionFactory.getObject();
// SqlSession sqlSession = sessionFactory.openSession();
// TbItemMapper itemMapper = sqlSession.getMapper(TbItemMapper.class);
System.out.println(&测试获取数据库会话对象Session:& + sqlSessionFactory.getObject().openSession());
TbItemExample itemExample = new TbItemExample();
Criteria criteria = itemExample.createCriteria();
criteria.andIdLessThan(700000L);
// criteria.andPriceEqualTo(49800L);
// 获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
// 紧跟着的第一个select方法会被分页
List&TbItem& items = itemMapper.selectByExample(itemExample);
// 打印返回的商品列表
for (int i = 0; i & items.size(); i++) {
System.out.println((i + 1) + &:& + items.get(i).getTitle());
// 获取分页信息
PageInfo&TbItem& pageInfo = new PageInfo&TbItem&(items);
long total = pageInfo.getTotal();
System.out.println(&共有商品:& + total);
注意:分页插件对逆向工程生成的代码支持不好(3.4.2版本),不能对有查询条件的查询分页,会抛异常。
& & & 但是后来使用4.1.6可以支持逆向工程。
官方文档:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1868次
排名:千里之外
(1)(2)(2)(1)(2)(1)}

我要回帖

更多关于 pagehelper分页查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信