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对象获取当前页的数据、总页数、总记录数等信息,并进行相应的展示。

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

相关推荐
80530单词突击赢1 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法2 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy2 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇2 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3162 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1113 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日3 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu4 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人4 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法4 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate