问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

分页查询实战:手把手教你用 PageHelper 实现优雅的分页功能!

创作时间:
作者:
@小白创作中心

分页查询实战:手把手教你用 PageHelper 实现优雅的分页功能!

引用
CSDN
1.
https://blog.csdn.net/2301_78858041/article/details/145986431

前言:为什么我们需要分页查询?

在开发 Web 应用时,我们经常需要处理海量数据的展示问题。例如,在一个电商平台上,商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端,不仅会导致页面加载缓慢,还会对数据库造成巨大压力。

为了解决这个问题,分页查询应运而生。通过页分查询,我们可以将数据分成若干个“页面”,每次只加载当前页面的数据。而
PageHelper
是一个功能强大且易于使用的分页插件,能够帮助我们快速实现分页功能。

本文将从
PageHelper
的起源、核心功能、使用方法到实际案例,一步步带你掌握分页查询的精髓!无论你是刚接触 MyBatis 的小白,还是有一定经验的开发者,这篇文章都能为你答疑解惑!

第一部分:PageHelper 的核心概念

1.1 什么是 PageHelper?

PageHelper
是一个基于 MyBatis 的分页插件,它通过拦截 MyBatis 的执行器(Executor)来实现分页功能。与传统的分页方式相比,
PageHelper
的优势在于:

  • 无需修改 SQL 语句:只需要在代码中添加几行配置即可实现分页。
  • 支持多种数据库:兼容 MySQL、Oracle、SQL Server 等主流数据库。
  • 灵活配置:支持自定义分页参数(如当前页、每页显示条数)。

1.2 PageHelper 的工作原理

PageHelper
的核心思想是通过拦截 MyBatis 的 SQL 执行过程,在 SQL 执行前后动态添加分页逻辑。具体流程如下:

  1. 开启分页插件。
  2. 执行 SQL 查询。
  3. 插件拦截 SQL,并在 SQL 后添加
    LIMIT
    或类似语法。
  4. 返回分页结果。

1.3 PageInfo 的作用

PageInfo

PageHelper
提供的一个封装类,用于存储分页信息(如当前页、总页数、总记录数等)。通过
PageInfo
,我们可以轻松获取分页相关的元数据。

第二部分:PageHelper 的使用步骤

2.1 引入依赖

首先,在项目中引入
PageHelper
的依赖。如果你使用的是 Maven,可以在
pom.xml
中添加以下依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId> 
    <artifactId>pagehelper</artifactId>
    <version>5.3.0</version>
</dependency>  

2.2 配置插件

在 MyBatis 的配置文件中(通常是
mybatis-config.xml
),添加
PageHelper
的插件配置:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"> 
        <!-- 配置全局的分页参数 -->
        <property name="helperDialect" value="mysql"/>
        <property name="offsetAsPageNum" value="true"/>
        <property name="rowBoundsWithCount" value="true"/>
    </plugin>
</plugins>  

2.3 编写 Mapper 接口

假设我们有一个
UserMapper
接口,用于查询用户数据:

public interface UserMapper {
    List<User> selectUsers(Page<User> page);
}  

2.4 实现分页查询

在 Service 层或 Controller 层中,我们可以使用
PageHelper.startPage()
方法开启分页:

@Service 
public class UserService {
    
    @Autowired 
    private UserMapper userMapper;
 
    public PageInfo<User> getUsers(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum,  pageSize);
        List<User> userList = userMapper.selectUsers(null); 
        return new PageInfo<>(userList);
    }
}  

2.5 返回分页结果

在 Controller 层中,我们可以将分页结果返回给前端:

@RestController 
@RequestMapping("/users")
public class UserController {
    
    @Autowired 
    private UserService userService;
 
    @GetMapping 
    public PageInfo<User> getUsers(@RequestParam int pageNum, @RequestParam int pageSize) {
        return userService.getUsers(pageNum,  pageSize);
    }
}  

第三部分:PageHelper 的核心功能

3.1 分页参数配置

PageHelper
提供了丰富的配置选项,例如:

  • pageNum
    :当前页码,默认为 1。
  • pageSize
    :每页显示的记录数,默认为 10。
  • orderBy
    :指定排序字段和排序方式。

代码示例:自定义分页参数

public PageInfo<User> getUsers(int pageNum, int pageSize, String orderBy) {
    PageHelper.startPage(pageNum,  pageSize).setOrderBy(orderBy);
    List<User> userList = userMapper.selectUsers(null); 
    return new PageInfo<>(userList);
}  

3.2 分页信息获取

通过
PageInfo
对象,我们可以获取丰富的分页信息:

  • getPageNum()
    :当前页码。
  • getPageSize()
    :每页显示的记录数。
  • getTotal()
    :总记录数。
  • getPages()
    :总页数。
  • getPrePage()
    :上一页的页码。
  • getNextPage()
    :下一页的页码。

代码示例:获取分页信息

public void printPageInfo(PageInfo pageInfo) {
    System.out.println(" 当前页码:" + pageInfo.getPageNum()); 
    System.out.println(" 总记录数:" + pageInfo.getTotal()); 
    System.out.println(" 总页数:" + pageInfo.getPages()); 
}  

3.3 分页插件的灵活性

PageHelper
支持多种数据库方言(如 MySQL、Oracle 等),并且可以通过配置实现不同的分页逻辑。例如,在 MySQL 中默认使用
LIMIT
关键字,在 Oracle 中则会使用
ROWNUM

第四部分:PageHelper 的优缺点

4.1 优点

  1. 简单易用:只需添加几行配置即可实现分页功能。
  2. 兼容性强:支持多种数据库方言。
  3. 功能丰富:提供了丰富的分页信息和自定义选项。

4.2 缺点

  1. 性能损耗:在大数据量场景下,可能会对性能产生一定影响。
  2. 依赖 MyBatis:仅支持基于 MyBatis 的项目。

第五部分:常见问题与解答

问题 1:为什么我的分页信息没有显示?

  • 答案:请检查是否正确配置了
    PageHelper
    插件,并确保在查询前调用了
    PageHelper.startPage()
    方法。

问题 2:如何处理排序问题?

  • 答案:可以通过
    PageHelper.startPage()

    setOrderBy()
    方法指定排序字段和排序方式。

问题 3:PageHelper 是否支持自定义 SQL?

  • 答案:是的。
    PageHelper
    支持在自定义 SQL 中实现分页功能。

第六部分:总结与展望

通过本文的学习,你已经掌握了
PageHelper
的核心概念、使用方法和实际应用。从它的起源到现代应用,再到具体的代码实现和最佳实践,每一个环节都进行了详细的讲解。

未来,随着 MyBatis 和
PageHelper
的不断发展,分页查询的功能会越来越强大。希望你能在此基础上继续探索和实践,写出更加高效、优雅的代码!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号