Java 逻辑分页 和 物理分页(mybatis的分页插件PageHelper)
目录
1 逻辑分页和物理分页的区别
2 项目框架展示
2.1 相关技术
2.2 相关依赖和配置
2.2.1 pom依赖
2.2.2 yml配置
2.3 实体类
3 逻辑分页
3.1 Sevice层
3.2 Controller层
3.3 测试
4 物理分页(使用Mybatis的分页插件PageHelper实现)
4.1 PageHelper
4.2 示例
4.2.1 Service层
4.2.2 Controller层
4.2.3 测试
1 逻辑分页和物理分页的区别
逻辑分页 | 物理分页 |
---|---|
逻辑分页依赖的是程序员编写的代码,数据库返回的不是分页结果,而是全部数据,然后再由程序员通过代码获取分页数据,常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合是有序,再根据索引获取指定范围的数据。 | 物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供的Limit关键字,程序员只需要编写带有Limit关键字的SQL语句,数据库返回的就是分页的结果。 |
只要访问一次数据库。 | 每次都要访问数据库,对数据库造成的负担大。 |
一次性将数据读取到内存,占用较大的内存空间,如果使用java开发,java本身引用框架就占用了很多内存,这无疑加重了服务器的负担。 | 每次只读取部分数据,占用的内存空间较小。 |
一次性将数据读取到内存,数据库数据发生改变,数据库的最新状态不能实时反映到操作中,实时性差。 | 每次需要数据时都要访问数据库,能够获取数据库的最新状态,实时性强。 |
适用于数据量较小、数据稳定的场合。 | 适用于数据量大、更新频繁的场合。 |
2 项目框架展示
2.1 相关技术
- SpringBoot 2.7.4
- Mybatis 2.2.2
- MySQL 8.0.26
- PageHelper 1.4.3
- Hutool-all 5.7.22
- Lombok
2.2 相关依赖和配置
2.2.1 pom依赖
<!-- pagehelper-spring-boot-starter --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.3</version></dependency><!-- mybatis-spring-boot-starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version><scope>runtime</scope></dependency><!-- hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
2.2.2 yml配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/数据库名?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: xxxpassword: xxx# 以下解决数据库连接池问题HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=58m22s480ms63µs200ns).hikari:auto-commit: true# 空闲超时时间idle-timeout: 60000# 连接超时时间connection-timeout: 60000# 最大生命周期max-lifetime: 0# 最小空闲连接数minimum-idle: 10# 最大连接数maximum-pool-size: 10
# mybatis 配置
mybatis:type-aliases-package: com.wen.pomapper-locations: classpath:mapper/*.xmlconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 分页
# pagehelper:
# helper-dialect: mysql
# reasonable: true
# support-methods-arguments: true
# params: count=countSql
2.3 实体类
/*** @author W* @createDate 2022/9/27* @description: 学生实体类*/
@Data
@EqualsAndHashCode(callSuper = false)
public class Stu implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String name;private Integer age;private String gender;private String address;private Date birth;
}
3 逻辑分页
3.1 Sevice层
public ResponseResult<?> getLogicPaging(int pageNum, int pageSize, Stu stu) {if(pageNum<=0) {pageNum = 1;}if(pageSize<=0) {pageSize = 10;}if(ObjectUtil.isEmpty(stu)){stu = new Stu();}List<Stu> stuList = stuMapper.selectAll(stu);//当前页第一条数据的下标int curIdx = pageNum > 1 ? (pageNum - 1) * pageSize : 0;List<Stu> pageList = new ArrayList<>();// 将当前页的数据放进pageListfor(int i = 0; curIdx + i < stuList.size() && curIdx + i < pageNum*pageSize; i++) {if(ObjectUtil.isNotEmpty(stuList.get(curIdx + i))) {pageList.add(stuList.get(curIdx + i));}}PageInfo<Stu> page = new PageInfo<>(pageList);page.setPageNum(pageNum);page.setPageSize(pageSize);page.setSize(pageList.size());page.setTotal(stuList.size());return ResponseResult.success(page);
}
3.2 Controller层
@GetMapping("/logicPaging")
public ResponseResult<?> getLogicPaging(int pageNum, int pageSize, Stu stu){return stuService.getLogicPaging(pageNum,pageSize,stu);
}
3.3 测试
![](/assets/blank.gif)
4 物理分页(使用Mybatis的分页插件PageHelper实现)
4.1 PageHelper
如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。
PageHelper官网地址:如何使用分页插件
4.2 示例
4.2.1 Service层
public ResponseResult<?> getPhysicalPaging(int pageNum, int pageSize, Stu stu) {if(pageNum<=0) {pageNum = 1;}if(pageSize<=0) {pageSize = 10;}if(ObjectUtil.isEmpty(stu)){stu = new Stu();}PageHelper.startPage(pageNum,pageSize);List<Stu> stuList = stuMapper.selectAll(stu);PageInfo<Stu> page = new PageInfo<>(stuList);//page.setPageNum(pageNum);//page.setPageSize(pageSize);//page.setSize(stuList.size());return ResponseResult.success(page);
}
4.2.2 Controller层
@GetMapping("/physicalPaging")
public ResponseResult<?> getPhysicalPaging(int pageNum, int pageSize, Stu stu){return stuService.getPhysicalPaging(pageNum,pageSize,stu);
}
4.2.3 测试
未完待续。。。。。。。。。
Java 逻辑分页 和 物理分页(mybatis的分页插件PageHelper)相关推荐
- SpringBoot集成MyBatis的分页插件PageHelper
[写在前面] 项目的后台管理系统需要展示所有资源信息,select * 虽然方便但数据量过于庞大会严重降低查找效率,页面加载慢,用户体验差.分页自然是必要选择,但原生的方法过于繁杂.MyBatis的分 ...
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
俗话说:好?不吃回头草,但是在这里我建议不管你是好马还是不好马,都来吃吃,带你复习一下分页插件PageHelper. 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心 ...
- Spring Boot系列教程八: Mybatis使用分页插件PageHelper
一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...
- Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper
1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...
- 【MyBatis】分页插件pageHelper的简单使用
pageHelper就是mybatis拦截器的一个应用,实现分页查询,支持常见的 12 种数据库的物理分页并支持多种分页方式. 使用PageHelper的好处是在实际项目开发中更方便. 原因是:在项目 ...
- 学习Spring Boot:(八)Mybatis使用分页插件PageHelper
首先Mybqtis可以通过SQL 的方式实现分页很简单,只要在查询SQL 后面加上limit #{currIndex} , #{pageSize}就可以了. 本文主要介绍使用拦截器的方式实现分页. 实 ...
- MyBatis使用分页插件pagehelper,遇到 IndexOutOfBoundsException: Index: 0, Size: 0] with root cause解决方法
在不使用条件查询的时候内容会完整的查询出来 pagehelper在使用的时候它首先会通过你给的条件内容先去数据库查询出来有多少条记录 然后在通过你自己写SQL语句查询分页的内容 假如我的SQL语句是: ...
- hql分页获取数据总数_最简洁的分页插件PageHelper
最简洁的分页插件PageHelper 简介 大部分后台管理项目,用的最多的展现方式是列表显示,所以我把列表查询中的分页插件拿出来写一下,方便以后写代码的时候直接复制粘贴.在我们最熟悉的springbo ...
- 使用mybatis框架分页插件报错### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
报错信息如下: ### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the ...
最新文章
- CentOS PPTP ×××
- 程序员的工作,四种情景的处理
- python中的sort,sorted
- Session执行机制与原理
- Product Distribution chain id F4 value help的实现
- 华为发布岳云鹏手机_刚刚,华为发布鸿蒙2.0!手机可用!
- 前端学习(1332):mongodb安装
- JAVA之private修饰成员方法默认是final型的?
- Python2.7.16安装(Win10)
- 用字典存储学生成绩查询_C语言 | 用结构体变量存储学生信息
- php.ini 设置内存,php.ini怎么进行内存设置
- Python Bug: TypeError: a bytes-like object is required, not ‘str
- 外汇交易系统(自动化/程序化/量化/EA)
- MATLAB—隐函数绘图
- led指示灯电路图大全(八款led指示灯电路设计原理图详解)
- 求过圆心直线与圆的两个交点
- BZOJ 1233 干草堆 (单调队列优化DP)
- 查看docker应用信息
- 2021年小米日常实习一面(自己整理的答案)
- mysql utl_file_Oracle的UTL_FILE包