PageHelper 是 MyBatis框架的 分页插件
优点:
- 支持常见的 12 种数据库。Oracle,MySql,MariaDB,SQLite,DB2,
PostgreSQL,SqlServer 等 - 物理分页
物理分页与逻辑分页的区别:
- 逻辑分页:
通过SQL将所有数据全部查询出来,然后通过结果集ResultSets进行类似offset的分页效果,实际上所有的结果已经查询出来了只是显示出来部分而已,常见的是mybatis的RowBounds,作用范围较小,只使用于数据量小变化浮动小的情况。 - 物理分页:
物理分离是在获取数据库的返回结果是就已经是offset的数据了,一般会有两种方式:第一种是通过传统的显示LIMIT实现分页,传入pageIndex和pageSize;第二种是通过PageHelper插件,在执行sql的时候通过拦截器进行sql拼接LIMIT,并且提供了PageInfo类返回,PageInfo中封装了返回结果和一些参与分页的详情数据
springboot项目整合pagehelper分页插件实战
项目结构:
1、需要的依赖:
其中pageHelper依赖:
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
maven仓库地址:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter
2、配置文件
# 端口
server.port=8073
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tzq?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
#mybatis控制台打印sql执行语句和结果
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
3、准备工作:entity,controller,service,mapper
entity:
/**
* @Author tangzhiqian
* @CreateTime 2021/6/10 17:19
*/
@Data
public class Csdn {
Integer id;
String title;
String url;
Integer isDelete;
}
controller:
/**
* @Author tangzhiqian
* @CreateTime 2021/6/10 17:24
*/
@RestController
@RequestMapping("/test")
public class CsdnController {
@Autowired
CsdnService csdnService;
@GetMapping("/selectAll")
public PageInfo<Csdn> getAll() {
return csdnService.selectAll();
}
}
srevice:
/**
* @Author tangzhiqian
* @CreateTime 2021/6/10 17:22
*/
@Service
public class CsdnService {
@Autowired
CsdnMapper csdnMapper;
public PageInfo<Csdn> selectAll(){
//设置分页参数(第几页,每页记录数)。该代码的下一行数据查询生效分页,下下行查询语句就不生效了,需要再次配置startPage
PageHelper.startPage(3,5);
//分页查询生效
List<Csdn> csdns = csdnMapper.selectList(null);
//用PageInfo对结果进行包装,
PageInfo<Csdn> pageInfo = new PageInfo<>(csdns);
return pageInfo;
}
}
mapper:
/**
* @Author tangzhiqian
* @CreateTime 2021/6/10 17:20
*/
@Repository
@Mapper
public interface CsdnMapper extends BaseMapper<Csdn>{
}
其中,我的分页操作的放在service代码里面的:
到这里分页环境搭建好了,打开浏览器试试:http://localhost:8073/test/selectAll
这里显示的是Pageinfo对象的信息(json格式),我们给他美化一下:
数据库中一共29个字段,这里显示了5个,因为分页查询生效了。
PageInfo类的属性
在使用pageHelper分页查询的时候,我们用PageInfo封装的了结果。
PageInfo到底是什么呢?
PageInfo封装了当前页的所有信息,包括当前页码,总页数,总条数,下一页页码,查询出来的list结果等等:
PageInfo的属性:
//当前页
private int currentPage;
//总页数
private int pageCount;
//总条数
private int totalRecord;
//页面大小
private int pageSize;
//是否有下一页
private boolean hasNextPage;
//是否有上一页
private boolean hasPrePage;
//当前页码数组
private int[] pageArray;
//当前页数据
private List<T> list;
//下一页
private int nextPage;
//上一页
private int prePage;
//是否是第一页
private boolean isFirstPage;
//是否是最后一页
private boolean isLastPage;
//开始行数
private int startRow;
//结束行数
private int endRow;
//需要显示多少页
private int navigatePages;
public PageInfo() {
this.navigatePages = 5; //默认显示5页
this.hasPrePage = true;
this.hasNextPage = true;
this.isFirstPage = false;
this.isLastPage = true;
}