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

目录

1 逻辑分页和物理分页的区别

2 项目框架展示

2.1 相关技术

2.2 相关依赖和配置

2.2.1 pom依赖

2.2.2 yml配置

2.3 实体类 

3 逻辑分页

3.1 Sevice层

扫描二维码关注公众号,回复: 14931826 查看本文章

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.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 测试

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

猜你喜欢

转载自blog.csdn.net/weixin_48568302/article/details/127101438