分页

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

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

相关文章
|
算法 自动驾驶 数据挖掘
3D检测:DETR3D
3D检测:DETR3D
882 0
3D检测:DETR3D
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍MongoDB数据库操作,包括创建与删除数据库、集合的显式与隐式创建、文档的增删改查、批量操作、分页查询及排序。以文章评论系统为例,演示数据存储结构及常用命令,涵盖insert、update、remove、find、limit、skip、sort等方法,帮助掌握MongoDB基本使用。
|
3月前
|
存储 Dubbo API
SpringCloud工程部署启
本文介绍SpringCloud微服务工程的搭建与部署,涵盖项目创建、数据库配置、服务启动及远程调用实现,通过RestTemplate完成服务间通信,帮助理解微服务拆分与协作机制。
SpringCloud工程部署启
|
3月前
|
存储 消息中间件 开发框架
应用架构图
技术架构是将业务需求转化为技术实现的关键过程,涵盖分层设计、技术选型与系统集成。本文详解单体与分布式架构,包括展现层、业务层、数据层及基础层的职责,以及应用间调用关系、外部系统交互与边界划分,为构建清晰的技术体系提供指导。
 应用架构图
|
3月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文介绍如何使用Nacos实现配置中心及集群搭建。涵盖配置管理、热更新、共享配置、优先级规则,并通过Nginx实现高可用集群部署,提升微服务架构下配置的动态管理与系统稳定性。
Nacos配置中心
|
传感器 人工智能 安全
2024年的7大网络安全新闻
2024年的7大网络安全新闻
|
Java 数据库连接 数据库
Spring Boot之Mybatis Plus:简化持久层开发的利器
本篇详细介绍了如何在Spring Boot应用中使用MyBatis Plus,一个用于简化持久层开发的工具。读者可以轻松实现CRUD操作,从而提高开发效率。展示了使用MyBatis Plus进行数据库操作的具体步骤。
1142 5
Spring Boot之Mybatis Plus:简化持久层开发的利器
|
iOS开发
Obsidian Day-Planner 插件新版本使用(0.7.X以上版本)
Obsidian Day-Planner 插件新版本使用(0.7.X以上版本)
656 0
Obsidian Day-Planner 插件新版本使用(0.7.X以上版本)
|
存储 算法 Linux
Linux内核代码中常用的数据结构
Linux内核代码中常用的数据结构
352 0
一篇文章让你搞懂浮点数在内存中的存储机制[保姆级教学]
一篇文章让你搞懂浮点数在内存中的存储机制[保姆级教学]

热门文章

最新文章