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上的代码时,就报了这个问题,这个问题的导致原因其实也就是我们不断更换登录账户所导致的。
986 0
remote: The project you were looking for could not be found.
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
547 4
|
SQL 运维 关系型数据库
CloudDBA初体验:SQL优化建议
CloudDBA帮助阿里云客户自动优化SQL语句
14841 0
|
消息中间件 负载均衡 Java
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?
RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?
|
9月前
|
Java 开发者
使用BigDecimal类进行精确的加、减、乘、除操作,并比较BigDecimal数组元素大小
总结起来,BigDecimal类是Java中一个强大的工具,用于精确控制浮点数运算,避免了传统浮点类型因精度问题可能造成的错误。在需要精确计算的场景中,如金融系统、科学计算等,BigDecimal是首选。通过以上介绍的方法,可以对BigDecimal进行高效稳定的算数操作及大小比较。
1047 12
|
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
941 0
element-UI el-table动态显示隐藏列造成固定一侧的列(fixed=“left/right“)错误显示
|
NoSQL 算法 Redis
redis7.0源码阅读(五):跳表(skiplist)
redis7.0源码阅读(五):跳表(skiplist)
1374 1
|
JavaScript 前端开发 Java
Intelidea ★ 教你使用 IDEA 配置和运行vue项目
Intelidea ★ 教你使用 IDEA 配置和运行vue项目
4662 0
Intelidea ★ 教你使用 IDEA 配置和运行vue项目
简单粗暴实现el-input只允许输入数字
简单粗暴实现el-input只允许输入数字
简单粗暴实现el-input只允许输入数字
|
4月前
|
消息中间件 人工智能 决策智能
AgentScope x RocketMQ:构建多智能体应用组合
AgentScope是阿里巴巴推出的开发者友好型多智能体框架,支持模块化、可定制的智能体应用开发。通过集成RocketMQ,实现高效、可靠的A2A通信,助力构建如“智能旅行助手”等复杂协作场景,提升开发效率与系统可扩展性。(238字)