1.插件写法
MyBatis 分页插件 - PageHelper
官网:https://gitee.com/free/Mybatis_PageHelper/
使用方法:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
首先导入Maven依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
在Mybatis的xml中导入 ,并修改<property name="properties">
中的value
改为helperDialect
<bean id="factoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 这是插件的配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!-- 注意!"""""""使用下面的方式配置参数,一行配置一个 -->
<!--Dialect 是方言 mysql 使用limit 每种数据库不一样-->
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
分页插件参数介绍(需要详细了解的再看)
分页插件提供了多个可选参数,这些参数使用时,按照上面两种配置方式中的示例配置即可。
分页插件可选参数如下:
dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。
下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。
closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
aggregateFunctions(5.1.5+):默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行 count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。
重要提示:
当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。
PageHelper.startPage 静态方法调用
还有一种的是侵入式调用RowBounds方式的调用,我们用第一种,原理是动态代理
在service使用
@Override
public PageInfo findAll(Integer page,Integer size) {
//开始使用分页
PageHelper.startPage(page,size);
List<Company> all = companyDao.findAll();
//使用pageInfo接受 Mybatis知道
PageInfo pageInfo = new PageInfo(all);
return pageInfo;
}
在Contorller使用
@RequestMapping(value = "/list",name = "显示所有公司列表")
public String list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5")Integer size){
PageInfo all = companyService.findAll(page, size);
request.setAttribute("page",all);
return "company/company-list";
}
前端分页栏
分页栏代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<div class="pull-left">
<div class="form-group form-inline">
总共${page.pages} 页,共${page.total} 条数据。
<select id="selectSize" onchange="showSelection(this.options[this.options.selectedIndex].value)" class="form-control">
<option ${page.size eq 5 ? 'selected="selected"' : ""}>5</option>
<option ${page.size eq 10 ? 'selected="selected"' : ""}>10</option>
<option ${page.size eq 20 ? 'selected="selected"' : ""}>20</option>
<option ${page.size eq 40 ? 'selected="selected"' : ""}>40</option>
</select> 条
</div>
</div>
<div class="box-tools pull-right">
<ul class="pagination" style="margin: 0px;">
<li >
<a href="javascript:goPage(1)" aria-label="Previous">首页</a>
</li>
<li><a href="javascript:goPage(${page.prePage})">上一页</a></li>
<c:forEach begin="${page.navigateFirstPage}" end="${page.navigateLastPage}" var="i">
<li class="paginate_button ${page.pageNum==i ? 'active':''}"><a href="javascript:goPage(${i})">${i}</a></li>
</c:forEach>
<li><a href="javascript:goPage(${page.nextPage})">下一页</a></li>
<li>
<a href="javascript:goPage(${page.pages})" aria-label="Next">尾页</a>
</li>
</ul>
</div>
<form id="pageForm" action="${param.pageUrl}" method="post">
<input type="hidden" name="page" id="pageNum">
<input type="hidden" name="PageSize" id="pageSize"value="${page.pageSize}">
</form>
<script>
function showSelection(selection){
document.getElementById("pageSize").value=selection;
goPage(1);
}
function goPage(page) {
document.getElementById("pageNum").value = page
var select=document.getElementById("selectSize")
var selectValue=select.options[select.options.selectedIndex].value
document.getElementById("pageSize").value = selectValue
document.getElementById("pageForm").submit()
}
</script>
</body>
</html>
将分页栏引入其他页面 并 传递表单action的 value
<!-- .box-footer-->
<div class="box-footer">
<jsp:include page="../common/pageMybatis.jsp">
<jsp:param name="pageUrl" value="${ctx}/system/dept/list.do" />
</jsp:include>
</div>
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() {
}
2.原生写法
构建PageBean类
package com.czh.web.PageBean;
import java.util.List;
public class PageInfo {
private Integer pageNumber;
private Integer pageSize;
private Integer startIndex;
private Integer totalPages;
private Long totalRecord;
private List list;
private Integer start;
private Integer end;
public PageInfo(Integer pageNumber,Integer pageSize,Long totalRecord,List list){
this.totalRecord=totalRecord;
this.totalPages = (int) (totalRecord%pageSize==0 ? (totalRecord/pageSize) : (totalRecord/pageSize+1));
this.list = list;
this.pageNumber=pageNumber;
this.pageSize=pageSize;
this.startIndex = (pageNumber - 1) * pageSize;
jisuan();
}
@Override
public String toString() {
return "PageInfo{" +
"pageNumber=" + pageNumber +
", pageSize=" + pageSize +
", startIndex=" + startIndex +
", totalPages=" + totalPages +
", totalRecord=" + totalRecord +
", list=" + list +
", start=" + start +
", end=" + end +
'}';
}
public void jisuan(){
if(totalPages<10){
start=1;
end=totalPages;
}else{
if(pageNumber<=10){
start=1;
end=10;
}else{
if(pageNumber==totalPages){
end = totalPages;
start =totalPages-9;
return;
}
start=pageNumber-4;
end=pageNumber+5;
}
}
}
public Integer getPageNumber() {
return pageNumber;
}
public void setPageNumber(Integer pageNumber) {
this.pageNumber = pageNumber;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getStartIndex() {
return startIndex;
}
public void setStartIndex(Integer startIndex) {
this.startIndex = startIndex;
}
public Integer getTotalPages() {
return totalPages;
}
public void setTotalPages(Integer totalPages) {
this.totalPages = totalPages;
}
public Long getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(Long totalRecord) {
this.totalRecord = totalRecord;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getEnd() {
return end;
}
public void setEnd(Integer end) {
this.end = end;
}
}
Contorller使用
@RequestMapping(value = "/list",name = "根据公司id,查询部门列表")
public String list(@RequestParam(defaultValue = "1") String id,@RequestParam(defaultValue = "1") Integer PageNumber,@RequestParam(defaultValue = "5") Integer PageSize){
System.out.println("页数:"+PageNumber);
//设置totalRecord
Long count=departmentService.findPageRecord(id);
//分页查询数据
List<Dept> all = departmentService.findPagelist(id,(PageNumber-1)*PageSize,PageSize);
System.out.println(all);
System.out.println("总数:"+count);
PageInfo pageInfo = new PageInfo(PageNumber,PageSize,count,all);
System.out.println(pageInfo);
request.setAttribute("page",pageInfo);
return "system/dept/dept-list";
}
Service使用
@Override
public List<Dept> findPagelist(String companyId, Integer startIndex, Integer PageSize) {
return departmentDao.findPagelist(companyId,startIndex,PageSize);
}
前端page.jsp使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<div class="pull-left">
<div class="pull-left">
<div class="form-group form-inline">
总共${page.totalPages} 页,共${page.totalRecord} 条数据。
<select id="selectSize" onchange="showSelection(this.options[this.options.selectedIndex].value)" class="form-control">
<option ${page.pageSize eq 5 ? 'selected="selected"' : ""}>5</option>
<option ${page.pageSize eq 10 ? 'selected="selected"' : ""}>10</option>
<option ${page.pageSize eq 20 ? 'selected="selected"' : ""}>20</option>
<option ${page.pageSize eq 40 ? 'selected="selected"' : ""}>40</option>
</select> 条
</div>
</div>
</div>
<div class="box-tools pull-right">
<ul class="pagination" style="margin: 0px;">
<li >
<a href="javascript:goPage(1)" aria-label="Previous">首页</a>
</li>
<li><a href="javascript:goPage(${page.pageNumber eq 1 ? 1 : page.pageNumber+1 })">上一页</a></li>
<c:forEach begin="${page.start}" end="${page.end}" var="i">
<li class="paginate_button ${page.pageNumber==i ? 'active':''}"><a href="javascript:goPage(${i})">${i}</a></li>
</c:forEach>
<li><a href="javascript:goPage(${page.pageNumber eq page.totalPages ? page.totalPages : page.pageNumber+ 1})">下一页</a></li>
<li>
<a href="javascript:goPage(${page.totalPages})" aria-label="Next">尾页</a>
</li>
</ul>
</div>
<form id="pageForm" action="${param.pageUrl}" method="post">
<input type="hidden" name="PageNumber" id="pageNum">
<input type="hidden" name="PageSize" id="pageSize"value="${page.pageSize}">
</form>
<script>
function showSelection(selection){
document.getElementById("pageSize").value=selection;
goPage(1);
}
function goPage(page) {
document.getElementById("pageNum").value = page
var select=document.getElementById("selectSize")
var selectValue=select.options[select.options.selectedIndex].value
document.getElementById("pageSize").value = selectValue
document.getElementById("pageForm").submit()
}
</script>
</body>
</html>
在其他页面引入该页面 传递action的 value
<div class="box-footer">
<jsp:include page="../../common/page.jsp">
<jsp:param name="pageUrl" value="${ctx}/system/dept/list.do" />
</jsp:include>
</div>
来自一位大佬的pageResult (仅供参考)
package cn.itcast.common.entity;
import java.io.Serializable;
import java.util.List;
/**
* 分页结果类
* @author Administrator
*
*/
public class PageResult implements Serializable {
private long total;//总记录数
private List rows;//当前页记录
private int page;
private int size;
private int totalPage;
private int beg;
private int end;
private int pre;
private int next;
private static int DEFAULT_PAGE_RANGE=4;
public PageResult(){}
public PageResult(long total, List rows, int page, int size) {
super();
this.total = total;
this.rows = rows;
this.page = page;
this.size = size;
// 计算
this.totalPage = (int) (total % size == 0 ? (total/size): (total/size+1));
// 获取显示起始页码
calcPage(page,totalPage,2);
this.pre = page == 1 ? 1: page-1;
this.next = page == totalPage ? totalPage:page+1;
}
public void calcPage(int pageNum,int pageCount,int sideNum){
int startNum = 0;
int endNum = 0;
if(pageCount<=sideNum){
endNum = pageCount;
}else{
if((sideNum+pageNum)>=pageCount){
endNum = pageCount;
}else{
endNum = sideNum+pageNum;
if((sideNum+pageNum)<=(2*sideNum+1)){
if((2*sideNum+1)>=pageCount){
endNum = pageCount;
}else{
endNum = 2*sideNum+1;
}
}else{
endNum = sideNum + pageNum;
}
}
}
if(pageNum<=sideNum){
startNum = 1;
}else{
if((pageNum+sideNum)>=pageCount){
if((2*sideNum+1)>=pageCount){
if((pageCount - 2*sideNum)>=1){
startNum = pageCount - 2*sideNum;
}else{
startNum = 1;
}
}else{
startNum = pageCount - 2*sideNum;
}
}else{
if((pageNum-sideNum)>=1){
startNum = pageNum - sideNum;
}else{
startNum = 1;
}
}
}
this.beg = startNum;
this.end = endNum;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getBeg() {
return beg;
}
public void setBeg(int beg) {
this.beg = beg;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getPre() {
return pre;
}
public void setPre(int pre) {
this.pre = pre;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
}