Spring Boot整合PageHelper

目录

一、添加pom依赖

二、如何使用pageHelper

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里的值。

但是如果你写出下面这样的代码,就是不安全的用法:

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    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。

问题:

  1. 如果SQL里有排序,他也会排序后进行统计,这样增加了SQL查询速度解决办法
  2. 每次点击另一页都会调用COUNT和list两个接口

解决办法(这里只是举例,方法肯定不止一种):

  1. 问题1解决办法,可以用插件自带的自定义统计来解决,但是这样你每次有排序的都需要在XML里写一个SQL,如果原来的逻辑改了,COUNTSQL忘记改了,会导致数量对不上
  2. 问题2解决办法,用缓存来保存COUNT数据(可设置过期时间),用空间来换时间
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Spring Boot整合PageHelper的步骤: 1. 添加PageHelper依赖 在pom.xml文件中添加PageHelper的依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency> ``` 2. 配置PageHelper 在application.properties或application.yml文件中添加PageHelper的配置: ```properties # 分页插件配置 pagehelper.helper-dialect=mysql pagehelper.reasonable=true pagehelper.support-methods-arguments=true pagehelper.params=count=countSql ``` 3. 使用PageHelper进行分页查询 在DAO层的方法中使用PageHelper进行分页查询,例如: ```java import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public PageInfo<User> getUsers(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.getUsers(); return new PageInfo<>(userList); } } ``` 4. 在Controller中使用分页查询结果 在Controller中调用Service层的方法获取分页查询结果,并将结果返回给前端页面,例如: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public PageInfo<User> getUsers(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { return userService.getUsers(pageNum, pageSize); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值