关于 MyBatis 的三种分页方式,你学废了吗?

MyBatis 是一个优秀的持久层框架,它为开发人员提供了一种通过简单的 XML 或注解方式来操作数据库的工具。在日常开发中,分页查询是非常常见的需求。MyBatis 提供了多种实现分页的方法,主要包括以下三种:

  1. 物理分页(Physical Pagination)
  2. 逻辑分页(Logical Pagination)
  3. 使用插件分页(Pagination with Plugins)

下面将详细讲解这三种分页方式的原理、实现步骤和各自的优缺点。

1、物理分页(Physical Pagination)

物理分页是指在 SQL 查询中直接使用数据库的分页语法,例如 LIMITOFFSET,通过 SQL 语句控制返回的数据范围。物理分页直接由数据库执行分页操作,性能相对较好。

1.1、原理

物理分页通过在 SQL 查询中加入分页条件,利用数据库的分页功能进行数据截取,返回所需的数据集。例如在 MySQL 中使用 LIMITOFFSET 实现分页。

1.2、实现步骤

1.2.1、在 XML 映射文件中配置分页 SQL

<select id="selectUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    ORDER BY id
    LIMIT #{offset}, #{limit}
</select>

1.2.2、在 Java 代码中调用分页查询

Map<String, Object> params = new HashMap<>();
int page = 1;  // 页码
int pageSize = 10;  // 每页显示条数
int offset = (page - 1) * pageSize;

params.put("offset", offset);
params.put("limit", pageSize);

List<User> users = session.selectList("selectUsers", params);
1.3、优点
  • 性能高:分页操作在数据库端完成,减少了网络传输的数据量。
  • 简单直接:实现方式简单,直接在 SQL 中添加分页参数。
1.4、缺点
  • 数据库依赖:分页语法依赖于具体的数据库实现,不同数据库的分页语法不同。
  • 代码重复:每个分页查询都需要重复编写分页 SQL。

2、逻辑分页(Logical Pagination)

逻辑分页是指在内存中进行分页操作,先查询出所有数据,然后在应用层进行分页。逻辑分页适用于数据量较小的情况,数据量较大时不推荐使用。

2.1、原理

逻辑分页通过在应用层对查询结果进行截取,返回所需的分页数据。先执行不带分页条件的查询,获取所有数据后,再根据分页参数截取子集。

2.2、实现步骤

2.2.1、在 XML 映射文件中配置查询 SQL

<select id="selectAllUsers" resultType="User">
    SELECT * FROM users
</select>

2.2.2、在 Java 代码中进行逻辑分页

List<User> allUsers = session.selectList("selectAllUsers");

int page = 1;  // 页码
int pageSize = 10;  // 每页显示条数
int start = (page - 1) * pageSize;
int end = Math.min(start + pageSize, allUsers.size());

List<User> usersPage = allUsers.subList(start, end);
2.3、优点
  • 数据库无关:不依赖于具体的数据库分页语法,具有良好的兼容性。
  • 简单实现:无需修改 SQL 语句,分页逻辑在应用层实现。
2.4、缺点
  • 性能低:需要一次性查询出所有数据,当数据量大时会占用大量内存,查询性能较差。
  • 适用范围有限:仅适用于数据量较小的场景。

3、使用插件分页(Pagination with Plugins)

MyBatis 支持通过插件机制实现分页,这种方式在性能和使用方便性上具有很大优势。常用的分页插件有 PageHelperMyBatis-Plus 提供的分页插件。

3.1、原理

分页插件通过拦截 MyBatis 执行的 SQL 语句,在执行查询前自动添加分页参数,从而实现透明的分页功能。开发者只需配置插件并调用分页方法,无需手动编写分页 SQL。

3.2、实现步骤(以 PageHelper 为例)

3.2.1、引入 PageHelper 依赖

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

3.2.2、配置 PageHelper 插件

@Configuration
public class MyBatisConfig {
    @Bean
    public PageInterceptor pageInterceptor() {
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        properties.setProperty("reasonable", "true");
        pageInterceptor.setProperties(properties);
        return pageInterceptor;
    }
}

3.2.3、在 Java 代码中使用分页插件

PageHelper.startPage(1, 10);
List<User> users = session.selectList("selectUsers");
PageInfo<User> pageInfo = new PageInfo<>(users);
3.3、优点
  • 高性能:分页操作在数据库端完成,减少网络传输的数据量,性能优于逻辑分页。
  • 使用方便:开发者无需编写分页 SQL,只需调用插件提供的方法即可实现分页功能。
  • 功能丰富:插件通常提供了丰富的分页功能,如自动计算总记录数、分页导航等。
3.4、缺点
  • 依赖第三方库:需要引入额外的依赖,并进行相应的配置。
  • 学习成本:需要学习和理解插件的使用方法和配置方式。

MyBatis 提供的三种分页方式各有优缺点,开发者应根据具体的业务需求和场景选择合适的分页方式:

  • 物理分页:适用于数据量较大、对性能要求较高的场景,分页操作在数据库端完成。
  • 逻辑分页:适用于数据量较小、不依赖数据库分页语法的场景,分页操作在应用层完成。
  • 使用插件分页:通过插件实现透明分页,适用于大多数场景,兼具高性能和易用性。

在实际开发中,建议优先考虑使用分页插件,因为这种方式既保证了高性能,又简化了开发过程。同时,分页插件通常提供了更多的功能和更好的扩展性,能够满足复杂的分页需求。无论选择哪种分页方式,都需要综合考虑系统的性能、易用性和维护成本,做出最适合业务需求的决策。

黑马程序员免费预约咨询

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值