目录
扫描二维码关注公众号,回复:
14931826 查看本文章
4 物理分页(使用Mybatis的分页插件PageHelper实现)
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.Driver
url: jdbc:mysql://localhost:3306/数据库名?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: xxx
password: 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.po
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
log-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<>();
// 将当前页的数据放进pageList
for(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 测试
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 测试
未完待续。。。。。。。。。