1.传统分页: PageBean
最开始学习的时候是使用PageBean对象封装分页数据的
首先需要对PageBean定义一些属性
然后dao中编写相应的代码查询出分页结果并封装到PageBean中
具体的代码如下
PageBean
package com.j.domain;
import java.util.List;
/**
* @Author: JunChen
* @Date: 2020/8/10 15:46
*/
public class PageBean<T> {
/**
* 用户选择的当前页码
*/
private int pageNumber;
/**
* 每页展示的个数
*/
private int pageSize;
/**
* 页面展示需要的总页数
*/
private int totalPage;
/**
* 页面需要展示总记录数
*/
private int totalCount;
/**
* 数据库需要的开始索引
*/
private int startIndex;
/**
* 动态条开始页码
*/
private int start;
/**
* 动态条结束页码
*/
private int end;
/**
* 页面需要展示的数据部分
*/
private List<T> data;
private void q4h5() {
if (totalPage < 10) {
start = 1;
end = totalPage;
} else {
start = pageNumber - 4;
end = pageNumber + 5;
//4-4<1,end = 9
if (start <= 1) {
start = 1;
end = 10;
}
if (end > totalPage) {
end = totalPage;
start = end - 9;
}
}
}
public PageBean(int pageNumber, int pageSize) {
/*
第一页 : limit 0,5
第二页: limit 5,5
第三页: limit 10,5
pageNumber: limit startIndex , pageSize
*/
this.pageNumber = pageNumber;
this.pageSize = pageSize;
startIndex = (pageNumber - 1) * pageSize;
}
public void setTotalCount(int totalCount) {
if (totalCount % pageSize == 0) {
totalPage = totalCount / pageSize;
} else {
totalPage = totalCount / pageSize + 1;
}
this.totalCount = totalCount;
q4h5();
}
//省略非重要的get set 和toString;
}
2.PageHelper
PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,
例如MySql,oracle等
PageHelper.startPage静态方法调用:
除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。
在你需要进行分页的 MyBatis查询方法前调用PageHelper.startPage静态方法即可,
紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
PageHelper分页原理
首先,PageHelper将前台传来的参数封装到Page的对象中,
接着将Page的副本存放入ThreadLocal中,这样应该是保证分页的时候,参数互不影响,
接着利用了mybatis提供的拦截器,取得ThreadLocal的值,
PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,
最后再次赋值给下一步操作,就实现了分页。
使用了PageHelper分页之后, 查询的sql语句后面还可不可以加; 为什么?
使用了PageHelper分页之后, 查询的sql语句后面就不可以再加;
因为PageHelper底层是基于拦截器来实现分页的,它会首先拦截到我们编写的查询所有的SQL语句(select * from tableName), 然后再后面拼接limit …实现分页,
类似于这样: select * from tableName limit …
如果此时我们的SQL语句中有; 那么结果就变成了这样:
select * from tableName; limit … 很明显这是一条错误的SQL
PageHelper在使用的时候,如果PageHelper.start()方法在查询列表之后执行, 会出现什么问题?
出现的问题是: 不会实现分页,而是查询到所有数据
因为PageHelper.start()方法是创建一个Page对象,并且设置3个属性初始化Page,然后将Page绑定到当前线程;
而分页方法在执行时会先判断当前线程是否有Page对象, 有才会执行分页, 没有就查询所有