使用PageHelper分页插件进行分页
摘要
com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件。
PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美。
原本以为分页插件,应该是很简单的,然而PageHelper比我想象的要复杂许多,它做的很强大,也很彻底,强大到使用者可能并不需要这么多功能,彻底到一参可以两用。但是,我认为,作为分页插件,完成物理分页任务是根本,其它的很多智能并不是必要的,保持它够傻够憨,专业术语叫stupid,简单就是美。
我们将简单介绍PageHelper的基本使用和配置参数的含义,重点分析PageHelper作为Mybatis分页插件的实现原理。
PageHelper官方文档
PageHelper的使用
PageHelper中参数介绍
我们主要使用PageInfo类来返回各种信息,下面是参数介绍
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow 和endRow 不常用,这里说个具体的用法
//可以在页面中"显示startRow 到endRow 共size 条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
}
添加Maven依赖
在使用PageHelper时,首先要保证导入的jar包正确与完整
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.3</version>
</dependency>
创建拦截器
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
1. 在 MyBatis 配置 xml 中配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
2. 在 Spring 配置文件中配置拦截器插件
使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
构建工具类,方便调用
创建PageUtils类
public PageInfo<Books> pageCreate(int pageNum,int pageSize) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BookMapper userMapper = (BookMapper) context.getBean("bookMapper");
PageHelper.startPage(pageNum, pageSize);
List<Books> list = userMapper.queryAllBook();
PageInfo<Books> pageInfo = new PageInfo<>(list);
return pageInfo;
}
在Controller中进行逻辑处理
//查询全部的书籍并写返回到一个书籍展示页面
@RequestMapping("/allBook")
public String list(Model model){
PageBean<Books> bean = new PageBean<>();
PageInfo<Books> info = bean.pageCreate(1, 20);
List<Books> list = info.getList();
model.addAttribute("list",list);
model.addAttribute("now",1);
model.addAttribute("pageTotal",info.getPages());
return "allBook";
}
//点击页码跳转
@RequestMapping("/page")
public String SelectPage(int value,Model model){
PageBean<Object> bean = new PageBean<>();
PageInfo<Books> info = bean.pageCreate(value, 20);
List<Books> list = info.getList();
model.addAttribute("pageTotal",info.getPages());
model.addAttribute("now",value);
model.addAttribute("list",list);
model.addAttribute("pageTotal",info.getPages());
return "allBook";
}
//点击前进或后退按钮
@RequestMapping("/next")
public String next_button(int now,Model model,int button){
PageBean<Object> bean = new PageBean<>();
if (button==0) {
PageInfo<Books> info = bean.pageCreate(now-1, 20);
List<Books> list = info.getList();
model.addAttribute("pageTotal", info.getPages());
model.addAttribute("now", now-1);
model.addAttribute("list", list);
model.addAttribute("pageTotal", info.getPages());
}else if(button==1){
PageInfo<Books> info = bean.pageCreate(now+1, 20);
List<Books> list = info.getList();
model.addAttribute("pageTotal", info.getPages());
model.addAttribute("now", now+1);
model.addAttribute("list", list);
model.addAttribute("pageTotal", info.getPages());
}
return "allBook";
}