3.分页

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

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

目录
相关文章
|
6月前
|
Cloud Native Ubuntu Linux
云原生
Docker是一个基于Go语言的开源容器化平台,实现“一次镜像,处处运行”。它通过容器技术将应用及其依赖打包,实现高效、轻量的部署与隔离,相比传统虚拟机启动更快、资源占用更少。
365 0
云原生
|
6月前
|
机器学习/深度学习 人工智能
AI大模型位置编码详解
位置编码为Transformer提供序列顺序信息,弥补注意力机制无位置感知的缺陷。主要分为绝对编码(如可学习、Sinusoidal)和相对编码(如RoPE、ALiBi)。RoPE通过旋转矩阵支持长序列,ALiBi以线性偏置增强外推能力。不同方法在长度外推、效率等方面各有优劣,广泛应用于LLaMA、BLOOM等大模型中。
446 0
AI大模型位置编码详解
|
6月前
|
机器学习/深度学习 存储 知识图谱
🫗 知识蒸馏
知识蒸馏是一种模型压缩技术,通过将大模型(教师)的知识迁移到小模型(学生)中,实现高效推理与良好性能的平衡。核心思想是利用教师模型的输出概率分布(软标签)指导学生模型训练,结合温度机制平滑分布,保留类别间关联信息。常用KL散度衡量软标签差异,并融合硬标签损失提升泛化能力。可分为黑盒(仅用输出)与白盒(用中间特征)蒸馏,广泛应用于模型轻量化场景。
434 0
 🫗 知识蒸馏
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
AI大模型Transformer基础结构
Transformer是2017年提出的基于注意力机制的神经网络,摒弃了传统RNN结构,采用自注意力与多头注意力机制,实现并行化处理和长距离依赖建模。其核心由编码器-解码器架构、位置编码、残差连接和层归一化组成,广泛应用于NLP任务,成为BERT、GPT等模型的基础。
725 0
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
AI大模型分词器详解
分词器是将文本转为模型可处理数字序列的关键组件。本文详解BPE、WordPiece、SentencePiece三大主流算法原理与优劣,对比其在多语言支持、分词粒度等方面的差异,并提供中英文实战代码示例,助你掌握词汇表构建流程、特殊标记处理及常见面试问题应对策略。
880 1
|
6月前
|
机器学习/深度学习 算法 关系型数据库
🎮 强化学习
强化学习通过智能体与环境交互,基于状态、动作和奖励学习最优策略。核心方法包括价值迭代、Q-learning、策略梯度及Actor-Critic框架,结合在线/离线学习与同/异策略优化,实现高效决策。
788 0
 🎮 强化学习
|
6月前
|
机器学习/深度学习 人工智能 缓存
AI大模型注意力机制详解
注意力机制是Transformer的核心,实现序列间动态关注。包括自注意力、交叉注意力、多头(MHA)、分组(GQA)、多查询(MQA)及低秩压缩的MLA等变体,平衡效率与性能,广泛应用于大模型优化与推理加速。
456 0
AI大模型注意力机制详解
|
6月前
|
缓存 算法 C++
⚡ 模型推理加速
大模型推理加速涵盖KV-Cache优化、连续批处理、投机解码、模型并行等技术,通过算法与系统协同优化,提升推理效率。vLLM等框架实现高效部署,兼顾吞吐与延迟,助力大模型落地。
276 0
 ⚡ 模型推理加速
|
6月前
|
存储 JSON 前端开发
🤖 Agent系统
大模型Agent是具备推理、规划、工具调用与记忆能力的智能体,核心架构含大脑、感知、行动与记忆模块,支持任务分解与反思优化,常用LangChain等框架实现复杂任务自动化。
166 0
|
6月前
|
缓存 Dubbo Java
什么是API网关
API网关作为微服务架构的统一入口,负责请求路由、协议转换、鉴权、限流、熔断降级等功能,简化客户端与后端服务的交互,提升系统安全性与可维护性,是现代分布式架构的核心组件。
168 0