SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能,PageHelper是一个非常流行的MyBatis分页插件,它支持多数据库分页,无需修改SQL语句即可实现分页功能。

本文在最后展示了两种依赖验证的结果。

文章目录

一、第一种依赖方式

1、在项目中使用 PageHelper 插件需要先添加依赖:

复制代码
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>4.1.3</version>
</dependency>

2、这种方式需要配置一个 config 文件

复制代码
package com.wen.config;

import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;

/**
 * @author : rjw
 * @date : 2024-09-20
 */
@Configuration
public class MyBatisConfig {

    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("dialect", "Mysql");
        properties.setProperty("offsetAsPageNum", "true");
        properties.setProperty("rowBoundsWithCount", "true");
        pageHelper.setProperties(properties);
        return pageHelper;
    }
}

3、setProperty 方法设置了三个分页插件的属性:

  • "dialect", "Mysql":指定了数据库方言为Mysql。(主要是因为SQL语句不同)。
  • "offsetAsPageNum", "true":这个属性通常用于指定是否将传入的 offset 参数当作 pageNum (页码)使用。在这个配置中,它被设置为true,意味着如果分页查询时传递了offset(偏移量),PageHelper会将其视为页码来处理。然而,这个设置通常不是必需的,因为PageHelper默认就是使用页码(pageNum)和每页记录数(pageSize)来进行分页的。
  • "rowBoundsWithCount", "true":这个属性用于指定是否进行 count 查询以获取总记录数。在分页查询时,知道总记录数是有用的,因为它可以让你在前端展示总页数或总记录数。设置为 true 表示 PageHelper 在执行分页查询时,会先执行一个 count 查询来获取总记录数。

二、第二种依赖方式

复制代码
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
	<version>1.2.10</version>
</dependency>

2、这种方式需要在配置文件配置一下,application.properties 或 application.yml 。

复制代码
pagehelper.helper-dialect=mysql   // 数据库   可选
pagehelper.reasonable=true        // 规整页码范围,应对负数或过大页码
pagehelper.support-methods-arguments=true  // 规整可以通过方法参数获取,可用可不用输入即可
pagehelper.params=count=countSql


pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

三、创建数据库表格

3、分页条件配置

复制代码
pagehelper:
  helper-dialect: mysql
  reasonable: true   // 规整页码范围
  support-methods-arguments: true   // 规整方法参数获取

四、代码示例

关于统一 API 响应结果封装,代码示例在 SpringBoot 项目统一 API 响应结果封装 。

关于 mybatis 的项目搭建在 SpringBoot 项目整合 MyBatis 框架 。

1、TestController
复制代码
package com.wen.controller;

import com.wen.data.Result;
import com.wen.data.ResultGenerator;
import com.wen.dto.TbUser;
import com.wen.service.TestService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/select")
    public Result<?> selectUserByPage(
    					@Param("pageSize") Integer pageSize, 
    					@Param("pageNumber") Integer pageNumber){
        return ResultGenerator.genSuccessResult(testService.selectUserByPage(pageSize, pageNumber));
    }
}
2、TestService
复制代码
package com.wen.service;

import com.github.pagehelper.PageInfo;
import com.wen.dto.TbUser;

public interface TestService {
    PageInfo<TbUser> selectUserByPage(Integer pageSize, Integer pageNumber);
}
3、TestServiceImpl
复制代码
package com.wen.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wen.dto.TbUser;
import com.wen.mapper.TbUserMapper;
import com.wen.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private TbUserMapper tbUserMapper;

    @Override
    public PageInfo<TbUser> selectUserByPage(Integer pageSize, Integer pageNumber) {
        // 这句代码要放在查询 mapper 语句的前面
        PageHelper.startPage(pageNumber, pageSize);
        List<TbUser> tbUsers = tbUserMapper.selectUser();
        PageInfo<TbUser> tbUserPageInfo = new PageInfo<>(tbUsers);
        return tbUserPageInfo;
    }
}
4、TbUserMapper
复制代码
package com.wen.mapper;

import com.wen.dto.TbUser;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface TbUserMapper {
    List<TbUser> selectUser();
}
5、TbUserMapper.xml
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wen.mapper.TbUserMapper">
    <select id="selectUser" resultType="com.wen.dto.TbUser">
        SELECT username, password FROM tb_user
    </select>
</mapper>

五、第一种依赖展示结果

http://localhost:8080/test/select?pageSize=5&pageNumber=1

复制代码
{
    "code": 1,
    "message": "SUCCESS",
    "data": {
        "pageNum": 1,
        "pageSize": 5,
        "size": 5,
        "orderBy": null,
        "startRow": 1,
        "endRow": 5,
        "total": 7,
        "pages": 2,
        "list": [
            {
                "id": 0,
                "username": "laowang",
                "password": "112233"
            },
            {
                "id": 0,
                "username": "laoli",
                "password": "123456"
            },
            {
                "id": 0,
                "username": "lisi",
                "password": "3344"
            },
            {
                "id": 0,
                "username": "wangwu",
                "password": "6677"
            },
            {
                "id": 0,
                "username": "周周",
                "password": "111"
            }
        ],
        "firstPage": 1,
        "prePage": 0,
        "nextPage": 2,
        "lastPage": 2,
        "isFirstPage": true,
        "isLastPage": false,
        "hasPreviousPage": false,
        "hasNextPage": true,
        "navigatePages": 8,
        "navigatepageNums": [
            1,
            2
        ]
    }
}

六、第二种依赖展示结果

http://localhost:8080/test/select?pageSize=5&pageNumber=1

复制代码
{
    "code": 1,
    "message": "SUCCESS",
    "data": {
        "total": 7,
        "list": [
            {
                "id": 0,
                "username": "laowang",
                "password": "112233"
            },
            {
                "id": 0,
                "username": "laoli",
                "password": "123456"
            },
            {
                "id": 0,
                "username": "lisi",
                "password": "3344"
            },
            {
                "id": 0,
                "username": "wangwu",
                "password": "6677"
            },
            {
                "id": 0,
                "username": "周周",
                "password": "111"
            }
        ],
        "pageNum": 1,
        "pageSize": 5,
        "size": 5,
        "startRow": 1,
        "endRow": 5,
        "pages": 2,
        "prePage": 0,
        "nextPage": 2,
        "isFirstPage": true,
        "isLastPage": false,
        "hasPreviousPage": false,
        "hasNextPage": true,
        "navigatePages": 8,
        "navigatepageNums": [
            1,
            2
        ],
        "navigateFirstPage": 1,
        "navigateLastPage": 2
    }
}
相关推荐
niucloud-admin37 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质1 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3762 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02142 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn2 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ3 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog3 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老3 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang4 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
鱼宵4 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21