MyBatis分页机制深度解析

前言

在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时。MyBatis 作为 我们Java 开发者的持久层框架,为分页提供了灵活的支持。

本篇文章我们将深入探讨 MyBatis 的分页机制,使我们在实际开发项目中运用自如。

在这里插入图片描述

MyBatis分页原理

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

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

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

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

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

在这里插入图片描述

MyBatis 分页插件

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

如何使用 MyBatis 分页插件

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

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

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

<dependency>  
    <groupId>com.github.pagehelper</groupId>  
    <artifactId>pagehelper-spring-boot-starter</artifactId>   
</dependency>

然后配置 PageHelper

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

<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:

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

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

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

public interface UserMapper {  
    List<User> selectAllUsers();  
}

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

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

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

  • 52
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威要向诸佬学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值