MyBatis常用分页方式

MyBatis 提供了多种实现分页的方法,主要包括以下三种:

1 物理分页(Physical Pagination)

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

1.1 原理

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

1.2 实现步骤

  1. 在 XML 映射文件中配置分页 SQL:
<select id="selectUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    ORDER BY id
    LIMIT #{offset}, #{limit}
</select>
  1. 在 Java 代码中调用分页查询
int page = 1;  // 页码
int pageSize = 10;  // 每页显示条数
int offset = (page - 1) * pageSize;

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

List&lt;User&gt; users = session.selectList("selectUsers", params);

1.3 优点

性能高:分页操作在数据库端完成,减少了网络传输的数据量。
简单直接:实现方式简单,直接在 SQL 中添加分页参数。

1.4缺点

数据库依赖:分页语法依赖于具体的数据库实现,不同数据库的分页语法不同。
代码重复:每个分页查询都需要重复编写分页 SQL。

2 逻辑分页(Logical Pagination)

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

2.1 原理

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

2.2 实现步骤

  1. 在 XML 映射文件中配置查询 SQL:
<select id="selectAllUsers" resultType="User">
    SELECT * FROM users
</select>
  1. 在 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 支持通过插件机制实现分页,这种方式在性能和使用方便性上具有很大优势。常用的分页插件有 PageHelper 和 MyBatis-Plus 提供的分页插件。

3.1 原理

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

3.2 实现步骤(以 PageHelper 为例)

使用mybatis-plus插件进行分页请参考文章

  1. 引入 PageHelper 依赖
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>
  1. 配置 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;
    }
}
  1. 在 Java 代码中使用分页插件
PageHelper.startPage(1, 10);
List<User> users = service.selectList("selectUsers");
PageInfo<User> pageInfo = new PageInfo<>(users);

3.3 优点

  • 高性能:分页操作在数据库端完成,减少网络传输的数据量,性能优于逻辑分页。
  • 使用方便:开发者无需编写分页 SQL,只需调用插件提供的方法即可实现分页功能。
  • 功能丰富:插件通常提供了丰富的分页功能,如自动计算总记录数、分页导航等

3.4 缺点

  • 依赖第三方库:需要引入额外的依赖,并进行相应的配置。
  • 学习成本:需要学习和理解插件的使用方法和配置方式。

4 用法总结

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值