当前位置:   article > 正文

Java 逻辑分页 和 物理分页(mybatis的分页插件PageHelper)_java pagehelper

java 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依赖

  1. <!-- pagehelper-spring-boot-starter -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.4.3</version>
  6. </dependency>
  7. <!-- mybatis-spring-boot-starter -->
  8. <dependency>
  9. <groupId>org.mybatis.spring.boot</groupId>
  10. <artifactId>mybatis-spring-boot-starter</artifactId>
  11. <version>2.2.2</version>
  12. </dependency>
  13. <!-- mysql -->
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. <version>8.0.26</version>
  18. <scope>runtime</scope>
  19. </dependency>
  20. <!-- hutool -->
  21. <dependency>
  22. <groupId>cn.hutool</groupId>
  23. <artifactId>hutool-all</artifactId>
  24. <version>5.7.22</version>
  25. </dependency>
  26. <!-- lombok -->
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. <optional>true</optional>
  31. </dependency>

2.2.2 yml配置

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/数据库名?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
  5. username: xxx
  6. password: xxx
  7. # 以下解决数据库连接池问题HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=58m22s480ms63µs200ns).
  8. hikari:
  9. auto-commit: true
  10. # 空闲超时时间
  11. idle-timeout: 60000
  12. # 连接超时时间
  13. connection-timeout: 60000
  14. # 最大生命周期
  15. max-lifetime: 0
  16. # 最小空闲连接数
  17. minimum-idle: 10
  18. # 最大连接数
  19. maximum-pool-size: 10
  20. # mybatis 配置
  21. mybatis:
  22. type-aliases-package: com.wen.po
  23. mapper-locations: classpath:mapper/*.xml
  24. configuration:
  25. map-underscore-to-camel-case: true
  26. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  27. # 分页
  28. # pagehelper:
  29. # helper-dialect: mysql
  30. # reasonable: true
  31. # support-methods-arguments: true
  32. # params: count=countSql

2.3 实体类 

  1. /**
  2. * @author W
  3. * @createDate 2022/9/27
  4. * @description: 学生实体类
  5. */
  6. @Data
  7. @EqualsAndHashCode(callSuper = false)
  8. public class Stu implements Serializable {
  9. private static final long serialVersionUID = 1L;
  10. private Integer id;
  11. private String name;
  12. private Integer age;
  13. private String gender;
  14. private String address;
  15. private Date birth;
  16. }

3 逻辑分页

3.1 Sevice层

  1. public ResponseResult<?> getLogicPaging(int pageNum, int pageSize, Stu stu) {
  2. if(pageNum<=0) {
  3. pageNum = 1;
  4. }
  5. if(pageSize<=0) {
  6. pageSize = 10;
  7. }
  8. if(ObjectUtil.isEmpty(stu)){
  9. stu = new Stu();
  10. }
  11. List<Stu> stuList = stuMapper.selectAll(stu);
  12. //当前页第一条数据的下标
  13. int curIdx = pageNum > 1 ? (pageNum - 1) * pageSize : 0;
  14. List<Stu> pageList = new ArrayList<>();
  15. // 将当前页的数据放进pageList
  16. for(int i = 0; curIdx + i < stuList.size() && curIdx + i < pageNum*pageSize; i++) {
  17. if(ObjectUtil.isNotEmpty(stuList.get(curIdx + i))) {
  18. pageList.add(stuList.get(curIdx + i));
  19. }
  20. }
  21. PageInfo<Stu> page = new PageInfo<>(pageList);
  22. page.setPageNum(pageNum);
  23. page.setPageSize(pageSize);
  24. page.setSize(pageList.size());
  25. page.setTotal(stuList.size());
  26. return ResponseResult.success(page);
  27. }

3.2 Controller层

  1. @GetMapping("/logicPaging")
  2. public ResponseResult<?> getLogicPaging(int pageNum, int pageSize, Stu stu){
  3. return stuService.getLogicPaging(pageNum,pageSize,stu);
  4. }

3.3 测试


4 物理分页(使用Mybatis的分页插件PageHelper实现)

4.1 PageHelper

        如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。

PageHelper官网地址:如何使用分页插件

4.2 示例

4.2.1 Service层

  1. public ResponseResult<?> getPhysicalPaging(int pageNum, int pageSize, Stu stu) {
  2. if(pageNum<=0) {
  3. pageNum = 1;
  4. }
  5. if(pageSize<=0) {
  6. pageSize = 10;
  7. }
  8. if(ObjectUtil.isEmpty(stu)){
  9. stu = new Stu();
  10. }
  11. PageHelper.startPage(pageNum,pageSize);
  12. List<Stu> stuList = stuMapper.selectAll(stu);
  13. PageInfo<Stu> page = new PageInfo<>(stuList);
  14. //page.setPageNum(pageNum);
  15. //page.setPageSize(pageSize);
  16. //page.setSize(stuList.size());
  17. return ResponseResult.success(page);
  18. }

4.2.2 Controller层

  1. @GetMapping("/physicalPaging")
  2. public ResponseResult<?> getPhysicalPaging(int pageNum, int pageSize, Stu stu){
  3. return stuService.getPhysicalPaging(pageNum,pageSize,stu);
  4. }

 4.2.3 测试

 未完待续。。。。。。。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/920786
推荐阅读
相关标签
  

闽ICP备14008679号