目录
1.调用查询语句之前调用pageHelper(这个必须的,如果写到构造器前面,如果构造器筛选条件过多可能会导致pageHelper失效)
一、添加pom依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>根据自己的springboot版本进行选择</version>
</dependency>
具体选择看:https://github.com/pagehelper/pagehelper-spring-boot
二、如何使用PageHelper
1.调用查询语句之前调用PageHelper(这个必须的,1.如果写到构造器前面,构造器筛选条件过多可能会导致PageHelper失效2.能保证代码安全)
PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
List<Entity> list = entityDao.selectInfo(wrapper);
为什么会产生安全问题,因为PageHelper.startPage方法会将分页信息放入ThreadLocal中,但是 PageHelper 方法调用后紧跟查询方法,就是安全的,因为查询方法后清除了Threadlocal里的值。
但是如果你写出下面这样的代码,就是不安全的用法:
PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
list = countryMapper.selectIf(param1);
} else {
list = new ArrayList<Country>();
}
这种情况下由于param1存在null 的情况,就会导致PageHelper生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。
三.可能出现的问题以及解决办法
如果自定义SQL那请使用mybatis-plus里的方法自定义SQL(不清楚的可以看我写的自定义SQL里面有教怎么写,Mybatis Plus自定义SQL_mybatisplus ew官网 sqlcus-CSDN博客),然后把PageHelper.startPage(vo.getPageNum(), vo.getPageSize());放在最后使用SQL的那个逻辑上面,因为如果放在构造器上面可能因为筛选逻辑很长会导致PageHelper.startPage失效。
解决PageHelper不安全方案:
1.遵从编码规范,保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法
2.手动调用page.clear方法。
PageHelper.clearPage();
3.更改不规范代码如下
List<Country> list;
if(param1 != null){
PageHelper.startPage(1, 10);
list = countryMapper.selectIf(param1);
} else {
list = new ArrayList<Country>();
}
四.优化思路(如果数据量不大可不用考虑)
目前的几款分页插件基本都会有个问题,首先都是使用物理分页,所以是拼接SQL。
问题:
- 如果SQL里有排序,他也会排序后进行统计,这样增加了SQL查询速度解决办法
- 每次点击另一页都会调用COUNT和list两个接口
解决办法(这里只是举例,方法肯定不止一种):
- 问题1解决办法,可以用插件自带的自定义统计来解决,但是这样你每次有排序的都需要在XML里写一个SQL,如果原来的逻辑改了,COUNTSQL忘记改了,会导致数量对不上
- 问题2解决办法,用缓存来保存COUNT数据(可设置过期时间),用空间来换时间