3.分页

简介: 本文介绍五种分页实现方式:MyBatis自带RowBounds内存分页、PageHelper插件分页、SQL原生分页、数组subList分页及拦截器分页。对比指出逻辑分页适用于小数据量,物理分页更适配大数据场景,推荐优先使用物理分页以提升性能与稳定性。

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<Student> queryStudentsByArray();

方法很简单,就是获取所有的数据,通过list接收后进行分页操作。创建StudentMapper.xml文件,编写查询的sql语句:

<select id="queryStudentsByArray"  resultMap="studentmapper"> select * from student </select>

可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。接下来在service层获取数据并且进行分页实现:

定义IStuService接口,并且定义分页方法:

List<Student> queryStudentsByArray(int currPage, int pageSize);

通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。

创建IStuService接口实现类StuServiceIml对方法实现,对获取到的数组通过currPage和pageSize进行分页:

@Override    
public List<Student> queryStudentsByArray(int currPage, int pageSize) { 
    List<Student> 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<Student> getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) { 
  List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize); 
    return student; 
}

通过用户传入的currPage和pageSize获取指定数据。

5 拦截器分页

自定义拦截器实现了拦截所有以ByPage【或自己约束的都是可以的】结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句。

6 总结

逻辑分页:即内存分页,就是mybatis自带的rowbounds,内存开销大,数据量小效率比物理分页快,但大数据量,易内存溢出

物理分页:上述2345,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。

物理分页总是优先于逻辑分页。

相关文章
|
Kubernetes 安全 Devops
【云效流水线 Flow 测评】驾驭云海:五大场景下的云效Flow实战部署评测
云效是一款企业级持续集成和持续交付工具,提供免费、高可用的服务,集成阿里云多种服务,支持蓝绿、分批、金丝雀等发布策略。其亮点包括快速定位问题、节省维护成本、丰富的企业级特性及与团队协作的契合。基础版和高级版分别针对小型企业和大规模团队,提供不同功能和服务。此外,云效对比Jenkins在集成阿里云服务和易用性上有优势。通过实战演示了云效在ECS和K8s上的快速部署流程,以及代码质量检测和AI智能排查功能,展示了其在DevOps流程中的高效和便捷,适合不同规模的企业使用。本文撰写用时5小时,请各位看官帮忙多多支持,如有建议也请一并给出,您的建议能帮助我下一篇更加出色。
219793 19
|
7月前
|
机器学习/深度学习 数据采集 人工智能
别再从零训练了:用迁移学习“借力打力”,小数据也能玩转大模型
别再从零训练了:用迁移学习“借力打力”,小数据也能玩转大模型
410 15
|
5月前
|
存储 弹性计算 小程序
阿里云最便宜云服务器怎么选?38元/99元/199元机型性能全解析
阿里云推出38元/年、99元/年、199元/年三档高性价比云服务器,分别面向个人开发者、小微初创及中小企业。本文从配置、实测性能与适用场景三维度深度对比,助力大家轻松选择低成本上云!
1057 4
|
6月前
|
弹性计算 人工智能 运维
阿里云服务器和轻量应用服务器选择指南:性能、适用场景、使用方法对比与选择参考
许多用户在选择阿里云服务器时,由于是初次选择,可能不知道云服务器ECS和轻量应用服务器的区别。本文对比了两者的产品定位、适用场景、产品优势及使用限制:ECS适合企业级用户,处理高并发、大数据等复杂场景;轻量应用服务器则面向个人开发者、学生及中小企业,适合轻量级应用。结合2026年特惠活动,文章提供了选购策略,帮助用户根据身份、需求、技术能力及长期成本选择合适的云服务器。
|
7月前
|
人工智能 安全 算法
CLEF 2026赛道简介:PAN、FinMMEval、CheckThat!(上)
CLEF 2026竞赛包含16个赛道,本文分上下两部分介绍其中的3个赛道:PAN、FinMMEval和CheckThat!
801 1
|
9月前
|
人工智能 安全
智能体来了从 0 到 1 :核心挑战,是非技术性的认知与场景重构
本文探讨AI智能体从概念到落地的核心瓶颈:非模型能力,而在业务理解与结构化水平。指出智能体本质是“决策执行体”,其成败取决于能否将模糊业务目标拆解为可执行、可校验、可容错的逻辑结构,强调目标对齐、任务拆解、知识显性化与人机协同评估体系。
393 3
|
10月前
|
持续交付 项目管理
阿里巴巴-云效
本文介绍了如何开通并使用云效平台进行项目管理与自动化部署。涵盖服务开通、需求管理、代码托管及流水线构建等步骤,帮助团队高效协作,实现代码自动发布流程的搭建与体验。
|
11月前
|
SQL 人工智能 运维
IDS/IPS不是“摆设机”,而是企业网络的“第二生命线”
IDS/IPS不是“摆设机”,而是企业网络的“第二生命线”
472 10
|
运维 安全 Linux
企微应用推荐-ZeroNews安全网关,打破内外网壁垒,让工作触手可及!
企业微信作为强大的协同平台,其开放性和集成能力是其核心优势之一。选择像ZeroNews这样专业、安全、易用的第三方内网应用集成方案,是您打通内外网信息壁垒、赋能移动办公、提升企业整体运营效率的明智之选。
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
601 11