PageHelper

(一)基本使用

1.使用上的小坑

一个查询的时候不要进行分页查询,只需要正常的进行查询全部就可以了,不要带limit什么的分页查询.
一定要用构造方法否则PageInfo里面的属性会出现有些没值的情况.
PageHelper[笔记] - 图1

2.Spring4.3.11版本整合PageHelper


<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.1</version>
</dependency>



3.其它说明

官方网站里面有详细的使用说明
https://pagehelper.github.io/docs/howtouse/
PageHelper只对紧跟着的第一个SQL语句起作用

com.github.pagehelper
pagehelper
最新版本

ü 需要在配置文件配置信息
这是低版本的下面有5.0以后配置版本


















这个是pageHelper5以后版本配置,跟上面的不一样
<plugin interceptor=”com.github.pagehelper.PageInterceptor”>



<property name=”rowBoundsWithCount” value=”true”/>
</plugin>
在Spring配置文件里面配置pagehelper

(二)官方网站使用详细说明

PageHelper[笔记] - 图2

(三)入门级别的使用

支持排序查询,具体看Service层

ü controller层
@RequestMapping(“/list”)
public String queryListPagehelper(Model model) {
Integer pageNum = 1;//当前行号
Integer pageSize = 3;//每页显示条数
PageInfo pageInfo = this.userService.queryListPagehelper(pageNum, pageSize, null);//PersonLmxi是要分页的实体类
//传给前台 前台需要用foreach ${pageInfo.list}循环取出
model.addAttribute(“pageInfo”, pageInfo);
return “/user/userlist”;
}
ü service层 (使用上可能会有小坑,需要注意一下)
/
分页查询(Service层)
@param pageNum //初始的页数
*
@param pageSize//每页最多显示多少条
*
@param record //查询条件(是当前的实体类)
*/
public PageInfo queryListPagehelper(Integer pageNum, Integer pageSize, PersonLmxi record) {
//开启分页,注意这个需要在第一行
PageHelper.startPage(pageNum, pageSize);
PageHelper.orderBy(
“user_updateTime desc”); // 排序字段!!!!!!!!!!!!!!!!
//根据条件查询所有.这个是通用mapper的方法(dao层只需要继承通用mapper即可)
List list =
this.userDao.select(record);//查询的
//直接返回一个分页对象
return new **PageInfo(list);
}

(四)前台jsp的基本API

page是服务端传过来,里面封装了分页信息

当前页号 ${page.pageNum}
页面大小 ${page.pageSize}
起始行号(>=) ${page.startRow}
终止行号(<=) ${page.endRow}
总结果数 ${page.total}
总页数 ${page.pages}
第一页 ${page.firstPage}
前一页 ${page.prePage}
下一页 ${page.nextPage}
最后一页 ${page.lastPage}

是否为第一页 ${page.isFirstPage}
是否为最后一页 ${page.isLastPage}
是否有前一页 ${page.hasPreviousPage} //boolean类型
是否有下一页 ${page.hasNextPage}

ü 下面应该是现成的前台页面代码,粘过去直接修改下就能用.




















前一页${nav}${nav} 下一页

(五)概念以及原理

1.概念

分页最麻烦的就是查询每页显示的数据,因为不同的数据库分页查询语句是不一样的,比如MySQL是limit 而oracle是三层嵌套伪列查询,
而pageHelper屏蔽了这些不同数据库的查询语句不一样,统一了调用方法,使得调用方法只有一个,你无需关心是什么数据库查询语句,只需要在配置文件告诉Pagehelper是什么数据库,它会自动生成对应的SQL语句
pageHelper是基于Mybatis的后台插件,前端分页还需要另外用别的技术来写,
我们使用的分页基本都是用物理分页然后就是需要提供自己编写服务器代码封装到PageInfo对象里面传递给前台用于回显.



2.原理

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select from student,拦截sql后重写为:select t. from (select * from student)t limit 0,10

3.关于分页自己定义pageResult的好处

自己定义pageResult的好处是自己定义的对象可以随意扩展里面的属性(你自己可以随意修改,程序的扩展性会好一些), 而PageInfo是pagehelper的,不能修改,
如果不需要扩展(确定就不扩展)就不需要自己自定义pageResult实体类
详情见AngularJs笔记分页那里这里就不详细写了