别再傻傻分不清!MyBatis两种分页方式到底用哪个?

记得我刚学MyBatis那会儿,最头疼的就是分页问题。每次看到一堆数据要处理,我就发愁------怎么才能优雅地实现分页啊?后来踩了不少坑才明白,MyBatis的分页其实主要有两种路子,每种都有自己的适用场景。今天我就用自己的理解,保证让你听完就知道该怎么选!

第一种:逻辑分页(RowBounds)- 省事但可能"翻车"

先说说我最开始用的方式------RowBounds逻辑分页。这玩意儿用起来真是简单到没朋友!

java 复制代码
List<User> users = sqlSession.selectList("getAllUsers", null, new RowBounds(5, 10));

看见没?就这么一行代码,意思是跳过前5条,取10条数据。MyBatis会在查询出所有数据后,自动在内存里帮你截取需要的部分。

优点

  • 写起来快,不用动SQL语句
  • 适合小数据量,开发效率高

缺点也很要命:

  • 数据量一大就直接崩了!而且极有可能的结果就是内存直接爆掉
  • 性能差,因为它先把所有数据都捞出来再进行截取所需要的数据,这个确实很麻烦!

这就好比你去书店买书,本来只想买一本,店员却把整个书店的书都搬出来让你挑,这样是不是感觉真的是闲的没事儿干了!还不如省功夫摸会儿鱼呢!

第二种:物理分页(SQL分页)- 靠谱但得费点劲

后来开始用物理分页。这种方法的核心是:直接在SQL语句里加上分页条件!这种方式相信大部分掘友们都有在使用,我现在有时候也会使用的。

比如在MySQL中:

sql 复制代码
SELECT * FROM users LIMIT 5, 10

这种方式的好处很明显:

  • 性能杠杠的!数据库只返回需要的数据
  • 内存占用小,多大的数据量都不怕

这就好比你去买书,直接告诉店员:"我要第6本到第15本书",人家直接拿给你,多高效!

实际开发中我是这么选的

现在我做项目的时候,会根据情况灵活选择:

如果是管理后台这种数据量不大的场景,偶尔用用RowBounds也没啥问题,毕竟开发速度快。

但如果是面向用户的产品,特别是数据量可能很大的场景,我一定用物理分页。虽然要多写点代码,但是稳定性更重要啊!

另外给大家分享个小技巧:现在有很多好用的分页插件,比如PageHelper,用起来特别方便,底层还是基于物理分页的,既保证了性能又简化了开发。现在很多人都在使用这个分页插件。

demo写法:

java 复制代码
// 使用PageHelper只需要三行代码
PageHelper.startPage(2, 10); // 第2页,每页10条
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);

如何引入: 要使用PageHelper也很简单,就直接在引入一下,比如sprintboot项目

xml 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>自行匹配</version>
</dependency>

配置的时候注意以下版本匹配!如果项目中使用的是MyBatis较新版本(如3.4.x及以上),建议优先使用5.3.0版本以避免兼容性问题。

总结一下

两种分页方式,没有绝对的好坏,只有合不合适:

  • 逻辑分页(RowBounds):适合菜鸟入门、小数据量、快速开发场景
  • 物理分页(SQL分页):适合正式项目、大数据量、高性能要求场景

我的建议是:刚开始学可以用RowBounds找感觉,但做正经项目还是老老实实用物理分页或者分页插件吧。或许现在可能很多人都把逻辑分页这东西已经忘记了吧!

毕竟我们现在都做的是"大项目"!哈哈自嘲一下!掘友们你们做过真正的大项目吗?

相关推荐
废柴程序员_熊熊1 分钟前
用 Docker 搭 n8n 私有服务器:2 个容器、382 MB 内存,附可导入的测试工程
后端
杨运交24 分钟前
086-对象存储模块-基于Spring Boot的文件存储模块监控设计与实现
java·spring boot·后端
Umi·30 分钟前
MySQL之DQL使用实例
数据库·mysql
利威尔xu37 分钟前
万字详解|Go 进阶(五):sync 包底层:Mutex 自旋 4 次转饥饿,WaitGroup 漏 1 个 Done 挂起 3000 goroutine
后端·golang·并发编程·源码分析·sync
贾公子1 小时前
检测结果怎么落库——表结构、状态机与三类对账
后端·mysql
z06.1 小时前
Linux系统中MySQL的安装
linux·mysql
136096757232 小时前
LLM 当裁判可靠吗:位置偏见、长度偏见、自我偏好
后端
拖孩2 小时前
流量主门槛从 500 降到 100,我的小程序上线 18 小时够到了线
前端·后端·微信小程序
养军博客2 小时前
Spring Security 4.x / 5.x / 6.x 配置全对比:前后端不分离与前后端分离
java·后端·spring·springsecurity
wifi___2 小时前
SpringBoot自动装配原理
java·spring boot·后端