分页

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

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

相关文章
|
2月前
|
安全 数据安全/隐私保护
RBAC权限模型
RBAC(基于角色的访问控制)通过角色管理权限,实现用户、角色、权限与资源的分离。其核心原则包括最小权限、职责分离与数据抽象,分为RBAC0至RBAC3四个层级,逐步支持角色继承与动态静态职责分离,提升系统安全与管理效率。
|
2月前
|
JSON Java 数据格式
String转JSON
该代码段演示了如何将字符串解析为JSON对象。通过`JSONObject.fromObject()`方法将包含中文的JSON字符串转换为JSONObject实例,并输出其标准格式化内容,适用于Java中处理JSON数据的场景。
|
2月前
|
JSON Java 数据格式
Object转JSON
该方法将Java对象转换为JSON字符串,使用JSONArray.fromObject实现序列化,并输出转换结果日志,最后返回生成的JSON字符串。适用于对象数据的JSON格式化处理。
|
2月前
|
uml C语言
系统时序图
时序图是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。用于展示交互流程、强调时序关系,直观表达并发过程。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于系统设计与分析。
系统时序图
|
2月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的部署与使用,涵盖源码获取、服务端数据库初始化、配置修改、服务启动及客户端注册全流程,并演示如何在控制台配置定时任务与调度策略,实现任务的高效管理与执行。
xxljob本地运行
|
2月前
|
人工智能 自然语言处理 Java
Java Client
本教程介绍如何使用Elasticsearch 7.17.x的新版Java Client配置客户端、创建索引、映射分析及增删改查文档。通过商城搜索场景,演示索引映射设计、Java模型类构建、批量导入数据等操作,并解决LocalDateTime序列化等问题,提升开发效率。
当前日期是否在[startDate, endDate]区间
判断当前日期是否在指定的开始日期和结束日期区间内。若开始或结束日期为空,则返回false;否则判断当前时间是否介于两者之间,是则返回true,否则返回false。适用于时间有效性校验场景。
|
2月前
|
监控 Java 调度
定时任务概述
定时任务是通过时间表达式调度执行的任务,适用于对账、提醒、订单超时等场景。实现方式包括单体架构的轮询、Timer、ScheduledExecutorService、Quartz、SpringTask,以及分布式架构下的TBSchedule、Elastic-Job、XXL-JOB等方案,解决集群重复执行、动态调整、故障转移与监控问题。
|
2月前
|
Java
Date转String
该代码定义了一个Java静态方法,用于将Date对象格式化为“yyyy-MM-dd HH:mm:ss”格式的字符串,使用SimpleDateFormat实现日期转换并返回结果。
获取某月该季度的第一个月
该方法用于获取指定日期所在季度的首个月份日期。通过预定义数组确定当前月份对应的季度,将日历调整至该季度第一个月并返回对应日期。适用于时间周期处理场景。

热门文章

最新文章