MyBatis分页

简介: 本文介绍MyBatis分页实现方式:RowBounds为内存分页,大数据易溢出;PageHelper等插件通过SQL改写实现物理分页,支持多数据库;还可借助subList或自定义拦截器分页。总结:大数据场景推荐物理分页,性能更优,优先于逻辑分页。(238字)

本文介绍MyBatis分页实现方式:自带RowBounds为内存分页,数据量大易溢出;PageHelper等插件通过SQL改写实现物理分页,支持多种数据库;还可通过数组subList或自定义拦截器实现。总结:大数据推荐物理分页,优先于逻辑分页。
1 自带rowbound分页
先将所有的结果集查询出来ResultSet,再进行内存分页(limit)2 第三方插件pagehelper会将一个查询SQL变成两部分执行,假设SQL是:select name from user;①自动识别数据库类型,添加对应的分页关键字,如MySQL则limit,Oracle则rownum,DB2则fetch,查找出上面SQL的结果②查找出上面结果,查询结果的总条数count3 SQL分页依赖limit进行实现,或者rownum等自身的SQL实现4 数组分页简而言之:查全部再subList首先在dao层,创建StudentMapper接口,用于对数据库的操作。在接口中定义通过数组分页的查询方法,如下所示:方法很简单,就是获取所有的数据,通过list接收后进行分页操作。创建StudentMapper.xml文件,编写查询的sql语句:
XML复制代码

select from student
可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。接下来在service层获取数据并且进行分页实现:定义IStuService接口,并且定义分页方法:
Java运行代码复制代码
List queryStudentsByArray(int currPage, int pageSize);
通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。创建IStuService接口实现类StuServiceIml对方法实现,对获取到的数组通过currPage和pageSize进行分页:
Java运行代码复制代码
@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中创建测试方法:
Java运行代码复制代码
@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,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。物理分页总是优先于逻辑分页。

相关文章
|
开发工具 数据安全/隐私保护 git
remote: The project you were looking for could not be found.
因为使用了不同的账号对不同的项目进行登录,在更换回原先的账户下载git上的代码时,就报了这个问题,这个问题的导致原因其实也就是我们不断更换登录账户所导致的。
1120 0
remote: The project you were looking for could not be found.
|
数据可视化 PyTorch 算法框架/工具
No module named ‘tensorboard‘ 解决方法
No module named ‘tensorboard‘ 解决方法
2364 0
|
Java 关系型数据库 MySQL
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
4661 1
maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)
|
JavaScript
element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示
问题原因:多个tabs共用一个实体,动态显示隐藏列 出现了固定在右侧的列(fixed="right")错位 【解决方案】 表格的重新布局,只要table数据发生变化的时候就重新渲染表格 ```js this.$nextTick(() => { this.$refs.formname.doLayout() }) ``` 参考element官方文档 ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-e40
1081 0
element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示
|
7月前
|
机器学习/深度学习 存储 自然语言处理
大模型基础概念术语解释
大语言模型(LLM)基于Transformer架构,通过海量文本训练,实现强大语言理解与生成。其核心包括注意力机制、位置编码、嵌入层等,支持万亿级参数与涌现能力,能完成翻译、问答等多任务,展现卓越泛化与推理能力。
|
7月前
|
监控 Java 调度
XXLJob定时任务概述
定时任务是基于时间表达式调度执行的任务,适用于定时对账、超时取消等场景。单体架构可使用轮询、Timer、ScheduledExecutorService、Quartz或SpringTask;分布式环境下需解决重复执行、故障转移等问题,主流方案有XXL-JOB、Elastic-Job、Saturn和ScheduleX。
|
12月前
|
Java 开发者
使用BigDecimal类进行精确的加、减、乘、除操作,并比较BigDecimal数组元素大小
总结起来,BigDecimal类是Java中一个强大的工具,用于精确控制浮点数运算,避免了传统浮点类型因精度问题可能造成的错误。在需要精确计算的场景中,如金融系统、科学计算等,BigDecimal是首选。通过以上介绍的方法,可以对BigDecimal进行高效稳定的算数操作及大小比较。
1236 12
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
751 5
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
602 4
【多线程面试题十六】、谈谈ReentrantLock的实现原理
这篇文章解释了`ReentrantLock`的实现原理,它基于Java中的`AbstractQueuedSynchronizer`(AQS)构建,通过重写AQS的`tryAcquire`和`tryRelease`方法来实现锁的获取与释放,并详细描述了AQS内部的同步队列和条件队列以及独占模式的工作原理。
【多线程面试题十六】、谈谈ReentrantLock的实现原理