MyBatis分页

简介: 本文介绍了五种分页实现方式:MyBatis自带RowBounds内存分页、PageHelper插件分页、SQL原生分页、数组分页及拦截器分页。其中,RowBounds和数组分页属逻辑分页,查询全量数据后在内存中切片,适合小数据量;而PageHelper、SQL分页、拦截器分页为物理分页,通过SQL限制减少数据传输,适用于大数据量,性能更优。总结指出,物理分页应优先于逻辑分页使用。

1 自带rowbound分页
先将所有的结果集查询出来ResultSet,再进行内存分页(limit)

2 第三方插件pagehelper
会将一个查询SQL变成两部分执行,假设SQL是:select name from user;
①自动识别数据库类型,添加对应的分页关键字,如MySQL则limit,Oracle则rownum,DB2则fetch,查找出上面SQL的结果
②查找出上面结果,查询结果的总条数count
3 SQL分页
依赖limit进行实现,或者rownum等自身的SQL实现
4 数组分页

简而言之:查全部再subList

首先在dao层,创建StudentMapper接口,用于对数据库的操作。在接口中定义通过数组分页的查询方法,如下所示:
List queryStudentsByArray();
方法很简单,就是获取所有的数据,通过list接收后进行分页操作。创建StudentMapper.xml文件,编写查询的sql语句:

select from student
可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。接下来在service层获取数据并且进行分页实现:
定义IStuService接口,并且定义分页方法:
List queryStudentsByArray(int currPage, int pageSize);
通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。
创建IStuService接口实现类StuServiceIml对方法实现,对获取到的数组通过currPage和pageSize进行分页:
@Override
public List queryStudentsByArray(int currPage, int pageSize) {
List students = studentMapper.queryStudentsByArray();
// 从第几条数据开始
int firstIndex = (currPage - 1)
pageSize;
// 到第几条数据结束
int lastIndex = currPage * pageSize; return students.subList(firstIndex, lastIndex);
}
通过subList方法,获取到两个索引间的所有数据。
最后在controller中创建测试方法:
@ResponseBody
@RequestMapping("/student/array/{currPage}/{pageSize}")
public List getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) {
List student = StuServiceIml.queryStudentsByArray(currPage, pageSize);
return student;
}
通过用户传入的currPage和pageSize获取指定数据。
5 拦截器分页
自定义拦截器实现了拦截所有以ByPage【或自己约束的都是可以的】结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句。
6 总结
逻辑分页:即内存分页,就是mybatis自带的rowbounds,内存开销大,数据量小效率比物理分页快,但大数据量,易内存溢出
物理分页:上述2345,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。
物理分页总是优先于逻辑分页。

相关文章
|
安全 Java Go
推荐几款免费实用的第五代图形验证码
推荐几免费实用的图形验证码,主要形式有滑动拼图、文字点选、语序点选、字体识别、空间推理、智能随机等。
1814 0
推荐几款免费实用的第五代图形验证码
|
JSON 数据格式
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
3288 0
|
3月前
|
人工智能 Java 开发者
Java接入AI大模型:从踩坑到顺滑落地的实战
本文分享Java开发者接入AI大模型的实战经验,从跨语言调用的坑到手动封装HTTP接口的繁琐,最终通过原生Java框架JBoltAI实现高效落地。该框架深度融入Spring生态,支持统一API调用主流大模型,提供高并发、熔断降级等企业级能力,助力Java团队零成本平滑集成AI能力,提升开发与运维效率。
341 1
|
10月前
|
移动开发 Dart 前端开发
【HarmonyOS 5】鸿蒙跨平台开发方案详解(二)
作为最早实现鸿蒙适配的跨平台框架,Flutter在社区推动下已形成较完整的技术方案。当前鸿蒙版Flutter已发布3.22.0-ohos版本,该版本基于Flutter 3.22.0核心。
857 0
|
10月前
|
安全 开发工具 git
如何使用分支回滚代码?
如何使用分支回滚代码?
1137 57
|
IDE Java 开发工具
Java“未封闭的 String 表达式”怎么解决
要解决Java中的“未封闭的 String 表示”问题,需检查并修正字符串字面量,确保每个字符串被正确地用双引号括起来。若字符串跨越多行,可使用字符串连接操作符(+)或引入文本块(JDK 13 及以上版本)。这能帮助避免语法错误,并使代码更整洁易读。
673 7
|
SQL 存储 关系型数据库
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
1171 0
|
Java 测试技术 数据处理
Java Function 接口详解
在 Java 编程中,Function 接口是一个非常重要的函数式接口,它允许你定义一个接受一个参数并产生结果的函数。Function 接口通常在各种数据处理和转换操作中使用,例如集合处理、流处理以及函数式编程。 本文将详细介绍 Function 接口的使用方法,包括如何创建、组合和使用 Function 接口的实例。我们还将讨论一些常见的应用场景,以帮助你更好地理解如何利用 Function 接口来简化代码
501 0
|
C++ Windows
Windows、IDEA、VS Code常用快捷键
Windows、IDEA、VS Code常用快捷键
539 0
|
资源调度 JavaScript Apache
Vue2使用echarts树图(tree)
这篇文章介绍了如何在Vue 3框架中集成echarts库来创建一个树状图(Tree Chart)组件,支持自定义数据和交互事件。
1175 0
Vue2使用echarts树图(tree)

热门文章

最新文章