分页

简介: 本文介绍了五种分页实现方式:MyBatis自带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,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。
物理分页总是优先于逻辑分页。

相关文章
|
22小时前
|
SQL Java 数据库连接
Activity代码实现
本教程通过创建BPMN流程、部署定义、启动实例、查询与完成任务,演示Activiti工作流引擎的基本使用。涵盖流程定义部署、任务操作及数据库表变化,帮助快速掌握工作流开发核心步骤。
|
22小时前
|
存储 API 数据库
Activiti框架拓展
Activiti表结构以ACT_开头,分五类:ACT_RE_*存流程定义等静态资源;ACT_RU_*存运行时实例、任务等数据;ACT_HI_*存历史记录;ACT_ID_*管理用户组信息;ACT_GE_*处理通用数据。各表协同支持流程引擎高效运作。
|
22小时前
|
存储 JSON Dubbo
Soul数据库设计
本插件采用数据库设计,存储插件、选择器、规则及其关联关系。核心四表:plugin、selector、rule、condition,体现Soul三大核心:插件、规则、选择器。支持多层级匹配,适用于Dubbo、SpringCloud等协议,灵活配置路由与处理逻辑。(238字)
|
22小时前
|
Java 关系型数据库 MySQL
Activiti工程搭建
本文介绍如何在Idea中创建Maven工程并安装Activiti插件,包含插件下载、版本兼容性修复及验证步骤,同时引入SpringBoot、MySQL、MyBatis与Activiti相关依赖,配置数据源与流程引擎,完成基础环境搭建,适用于工作流项目快速开发。
|
22小时前
|
缓存 Dubbo Java
什么是API网关
API网关是一种架构思想,用于统一接收外部请求并转发至后端服务,实现协议转换、路由、鉴权、限流、熔断降级等功能。通过网关,可简化客户端调用,提升系统安全性与可维护性。常见实现如Kong、Zuul、Spring Cloud Gateway等,广泛应用于微服务架构中,支持异步处理、全链路监控与多维度流量控制。
|
22小时前
|
缓存 前端开发 安全
数据同步原理
Soul 网关通过推拉模式从配置服务同步数据,支持 WebSocket、HTTP 长轮询和 Zookeeper 三种方式。1.x 版本基于 Zookeeper 推送,2.x 版本默认采用 HTTP 长轮询(借鉴 Apollo/Nacos),实现秒级更新。管理后台变更配置后,通过 EventPublisher 发布事件,根据 sync.strategy 策略将变更推送给网关并更新本地缓存。WebSocket 主动推送全量+增量数据;Zookeeper 利用 watch 机制监听节点变化;HTTP 长轮询则通过异步 Servlet + BlockingQueue 实现准实时同步,保障配置一致性。
|
1天前
|
安全 Java 数据安全/隐私保护
认识SpringSecurity
SpringSecurity是Java领域主流的权限管理框架,核心功能包括认证、鉴权与安全防护。支持表单、OAuth2、JWT等多种认证方式,基于过滤器链实现请求授权、方法级控制及RBAC模型,并可防御CSRF等常见攻击,具备高扩展性与灵活性,保障系统安全。
|
22小时前
|
Dubbo JavaScript 前端开发
Soul网关接入与验证
本文介绍如何将服务提供者与消费者接入Soul网关,涵盖pom依赖、Controller注解(@SoulSpringMvcClient)、配置文件参数说明(如adminUrl、contextPath、full模式等),并支持HTTP与Dubbo双协议。通过zookeeper注册,结合soul-admin与soul-bootstrap启动,完成服务注册与网关路由验证,附完整代码与测试示例。
|
21小时前
|
存储 Java 关系型数据库
微服务概述
本文介绍单体与微服务架构区别,阐述微服务定义、特征及优缺点,涵盖技术选型、部署方案与学习路径,帮助理解微服务演进逻辑及其分布式设计精髓,为构建高内聚、低耦合系统提供理论支撑。