PageHelper分页标签的使用方法
介绍:Mybatis的一个插件,非常方便mybatis的分页查询。国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释(ps:某些源码一大堆英文,痛哭流涕!)
在github上仓库地址为:Mybatis-PageHelper
它支持基本主流与常用的数据库,这可以在它的文档上看到。这里记录一下使用的基本方法
1. 在pom.xml中导入pageHelper相关依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2. 在mybatis-config.xml中配置相关配置
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.pojo"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
这里就说明一下reasonable的配置:
reasonable
:分页合理化参数,默认值为false
。
当该参数设置为 true
时,pageNum<=0
时会查询第一页,pageNum>pages
(超过总数时),会查询最后一页。
默认false
时,直接根据参数进行查询。
3. 在controller中编写分页标签的代码
@RequestMapping("All")
public String findAll(Model model,Integer currentPage){
//在查询语句前调用PageHelper的startPage方法,否则分页查询不生效
PageHelper.startPage(currentPage, 3);
//分页查询
List<Girl> list = girlService.findAll();
//使用PageInfo包装查询结果,只需要将pageInfo交给页面就可以
PageInfo pageInfo = new PageInfo<>(list,3);
model.addAttribute("girlList",list);
model.addAttribute("pageInfo",pageInfo);
return "girls";
}
这里介绍一下pageInfo
这个被包装的对象
- 想要了解,就要看底层源码,我们看一下
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;
public PageInfo() {
}
/**
* 包装Page对象
*
* @param list
*/
public PageInfo(List<T> list) {
this(list, 8);
}
/**
* 包装Page对象
*
* @param list page结果
* @param navigatePages 页码数量
*/
public PageInfo(List<T> list, int navigatePages) {
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
this.total = page.getTotal();
//由于结果是>startRow的,所以实际的需要+1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//计算实际的endRow(最后一页的时候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.list = list;
this.size = list.size();
this.total = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
//计算导航页
calcNavigatepageNums();
//计算前后页,第一页,最后一页
calcPage();
//判断页面边界
judgePageBoudary();
}
}
.......
}
源码还有一部分,我就没有列出来,就简单列举出他的所有属性和构造方法,我对上面的属性进行了注释,可以看的更直观一点
看得出来,pageInfo
这个已经被封装的对象,帮助我们省了很大的事情,比之前写JavaWeb
项目还需要自己定义对象和属性然后调用方便太多
4. 在前端jsp页面编写上一页下一页标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>地址</td>
</tr>
<!-- 注意! 在EL表达式中,用.list即可调用pageInfo中封装的list对象 -->
<!-- 遍历查询结果 -->
<c:forEach items="${pageInfo.list }" var="girl">
<tr>
<td>${girl.id}</td>
<td>${girl.name}</td>
<td>${girl.age}</td>
<td>${girl.address}</td>
</tr>
</c:forEach>
</table>
<!-- 点击查询 -->
<a href="${pageContext.request.contextPath}/girl/All?currentPage=1">首页</a>
<!-- 有上一页的时候显示上一页 -->
<c:if test="${pageInfo.hasPreviousPage}">
<a href="${pageContext.request.contextPath}/girl/All?currentPage=${pageInfo.pageNum-1}" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
</c:if>
<!-- 有下一页的时候显示下一页 -->
<c:if test="${pageInfo.hasNextPage}">
<a href="${pageContext.request.contextPath}/girl/All?currentPage=${pageInfo.pageNum+1}"
aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
</c:if>
<a href="${pageContext.request.contextPath}/girl/All?currentPage=${pageInfo.pages}">尾页</a>
至于前端的东西,基本也可以以一套百,用到别的项目的时候,改一改参数和方法路劲就可以了
5. 输出案例