SpringBoot(2.7.x)中使用PageHelper

如何在SpringBoot中使用PageHelper

  1. 先添加依赖

    com.github.pagehelper pagehelper-spring-boot-starter 1.2.12
  2. SpringBoot 2.6.x及以上版本要开启循环依赖(除非你的SpringBoot版本兼容PageHelper版本)

    这些代码写在application.yml中。

    spring:
    datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/learn_java?usessl=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    main:
    allow-circular-references: true

    下面是PageHelper的配置

    pagehelper:
    helper-dialect: mysql
    reasonable: false
    default-count: true

  3. 然后在自定义的控制器中进行测试:

    @Autowired
    private BookService bookService;

    @GetMapping
    public void selectAll(){
    PageHelper.startPage(1,6); //第一个参数表示第几页,第二个参数表示每页含几条数据。
    List userList = bookService.selectAll();
    PageInfo pageInfo = new PageInfo(userList);
    System.out.println(pageInfo);
    }

注意:

  • 分页插件只对PageHelper. startPage( pageNum, pageSize )后执行的的第一个select语句进行分页。
  • 上面的这段代码会返回第一页的数据,如果要返回第n页的数据,可以使用PageHelper. startPage( n, 6 )。

关于PageHelper的坑(官方文档中更详细)

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

复制代码
PageHelper.startPage(1, 10);
List<User> list;
if(param1 != null){
    list = userMapper.selectIf(param1);
} else {
    list = new ArrayList<User>();
}

这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数 就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

上面这个代码,应该写成下面这个样子:

复制代码
List<User> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = userMapper.selectIf(param1);
} else {
    list = new ArrayList<User>();
}

这种写法就能保证安全。

如果你对此不放心,你可以手动清理ThreadLocal存储的分页参数,可以像下面这样使用:

复制代码
List<User> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    try{
        list = userMapper.selectAll();
    } finally {
        PageHelper.clearPage();
    }
} else {
    list = new ArrayList<User>();
}

这么写很不好看,而且没有必要。

相关推荐
高频因子挖掘机3 分钟前
股票池代码为什么总有问题?从常见误区到可解释的校验报告
后端·github·api
邪修king2 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料2 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y3 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
考虑考虑7 小时前
nginx路由重写
运维·后端·自动化运维
曹牧7 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头8 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记8 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
JaguarJack8 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php·服务端
BingoGo8 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php