MyBatis分页机制深度解析

前言

在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时。MyBatis 作为 我们Java 开发者的持久层框架,为分页提供了灵活的支持。本篇文章我们将深入探讨 MyBatis 的分页机制,使我们在实际开发项目中运用自如。

MyBatis分页原理

在讲解mybatis的分页原理之前,我们先来看一下:内存分页 vs. 数据库分页

  • 内存分页:查询数据库获取全部数据,然后在内存中进行分页。这种方式简单但效率低下,当数据量巨大时可能导致内存溢出。
  • 数据库分页:利用数据库的分页功能(比如 MySQL 的 LIMIT 和 OFFSET),仅查询当前页的数据。这种方式效率高,但需要编写特定的 SQL。

现在我们再具体讲MyBatis 的分页方式。

MyBatis 支持两种分页方式:物理分页和内存分页。但是在实际应用中,博主比较推荐使用物理分页。

  • 物理分页:通过特定的 SQL 实现,依赖数据库的分页功能。
  • 内存分页:虽然 MyBatis 支持,但不推荐在大数据量场景下使用。

MyBatis 分页插件

为了实现物理分页,MyBatis 提供了分页插件,如 PageHelper。这些插件可以自动修改原始 SQL,添加分页相关的语句。

如何使用 MyBatis 分页插件

接下来我们讲解一下如何使用 MyBatis 分页插件 。

首先第一步肯定是引入依赖

先创建一个 Maven 项目,引入 PageHelper 依赖:

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

然后配置 PageHelper

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

java 复制代码
<plugins>  
    <plugin interceptor="com.github.pagehelper.PageInterceptor">  
        <property name="dialect" value="mysql"/> <!-- 根据实际数据库选择方言 -->  
        <property name="reasonable" value="true"/> <!-- 支持接口参数中的 pageNum 和 pageSize 为 0 时使用默认值 -->  
        <property name="supportMethodsArguments" value="true"/> <!-- 支持通过 Mapper 接口参数来传递分页参数 -->  
        <property name="params" value="count(countSql)"/> <!-- count 查询的 SQL 参数 -->  
    </plugin>  
</plugins>

最后使用 PageHelper

在 Mapper 接口或 Service 层使用 PageHelper:

java 复制代码
// 在查询之前设置分页参数  
PageHelper.startPage(pageNum, pageSize);  
List<User> users = userMapper.selectByExample(example);  
// 使用 PageInfo 包装查询结果,获取分页信息  
PageInfo<User> pageInfo = new PageInfo<>(users, pageSize);

以博主之前做过的课设项目为例:

我们手上现在有一个UserMapper接口,用来查询用户数据:

java 复制代码
public interface UserMapper {  
    List<User> selectAllUsers();  
}

在Service层或Controller层中,我们这时候可以使用PageHelper来实现分页:

java 复制代码
@Service  
public class UserService {  
    @Autowired  
    private UserMapper userMapper;  
      
    public PageInfo<User> getUsers(int pageNum, int pageSize) {  
        PageHelper.startPage(pageNum, pageSize);  // 启动分页  
        List<User> users = userMapper.selectAllUsers();  // 查询用户数据  
        return new PageInfo<>(users);  // 使用PageInfo包装查询结果,获取分页信息  
    }  
}

当调用getUsers方法时,PageHelper会自动为selectAllUsers方法中的SQL添加分页语句,从而只查询当前页的数据。

前端可以根据返回的PageInfo对象获取当前页的数据、总页数、总记录数等信息,并进行相应的展示。

文章到这里就先结束了,后续会继续分享相关的知识点。

相关推荐
念何架构之路13 小时前
路由注册:RouterGroup(routergroup.go)
开发语言·后端·golang
小当家.10513 小时前
LLM服务缓存与连接池管理:三层缓存架构与ChatClient池化
java·后端·spring·缓存·llm·agent
人间凡尔赛14 小时前
当 AI Agent 攻陷网关:Istio agentgateway 与 Gateway API Inference Extension 实战解析
后端·云原生·架构
wwwzhouzy14 小时前
SpringBoot 响应式编程
java·spring boot·后端·响应式编程
Python私教14 小时前
请求超时不等于失败:把写操作恢复设计成事实回读
后端·python
goldbin_zhang_xu14 小时前
我用 Go 重写了一个 OpenClaw 框架:这就是 GoClaw
开发语言·后端·golang·agent框架·goclaw·双循环机制
IT_陈寒14 小时前
Redis的KEYS命令差点把我的生产环境拖垮,改用SCAN吧
前端·人工智能·后端
冰夏之夜影14 小时前
【解决方案】SpringBoot项目添加ssl证书后不生效问题
spring boot·后端·ssl
2601_9638702114 小时前
【计算机毕业设计】基于Spring boot+Vue系统的健身俱乐部管理系统的设计与实现
spring boot·后端·课程设计
倔强的石头_14 小时前
TextIn xParse + WorkBuddy实战,零门槛轻松打造财报解析助手
后端