什么是分页?如何使用分页?(一)

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 什么是分页?如何使用分页?

🎒1.逻辑分页(假分页)

逻辑分页:逻辑分页依赖于代码。(例:Mybatis自带的分页插件就是逻辑分页)

同时逻辑分页是先查询出所有的数据,再根据代码块的所需(例:你需要拿到第几页,每页几条的数据)筛选出合适的数据进行分页。


通过SQL将所有数据全部查询出来,然后根据游标进行筛选,只是显示出来部分而已。

好处是所有数据库都统一,坏处就是效率低。

📚2.物理分页(真分页)

物理分页:物理分页依赖于数据库。(更侧重于sql语句)

例:MySQL数据库提供的分页关键字"limit",程序员只需要编写带有关键字的SQL语句,数据库返回的数据就是分页结果。


物理分页就是数据库本身提供了分页方式,如MySQL的limit,oracle的rownum 。

好处是效率高,不好的地方就是不同数据库有不同的搞法。

🏃3.两者对比

概念简单点讲:

逻辑分页就是半自动化的一个分页步骤(因为需要传递相关参数,所以是半自动化的);

物理分页就是手写SQL语句实现的分页。

1.数据库方面

物理分页是手写SQL语句,故每一次分页都需要访问数据库;逻辑分页是将全部数据查询出来后再进行的分页,只需访问一次数据库。所以说,物理分页对于数据库造成的负担大。

2.服务器方面

逻辑分页一次性将所有的数据读取至内存中,占用了较大的内存空间;物理分页每次只读取所需的数据,占用内存比较小。

3.实时性

逻辑分页一次性将数据全部查询出来,如果数据库中的数据发生了改变,逻辑分页就不能够获取最新数据(不能自动更新数据),可能导致脏数据的出现,实时性较低

物理分页每一次分页都需要从数据库中进行查询,这样能够获取数据库中数据的最新状态,实时性较高。

👯4.逻辑分页代码实现;

导入pom的依赖;

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency><!--导入分页插件-->
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>
注意版本依赖不然会使循环 报错 

核心代码

核心代码展示说明:

//开启分页 ,pageNum 页数    pageSize  每页几条数据 切记查询全部的方法是和 PageHelper.startPage(pageNum,pageSize); 必须在一起否者会导致报错;返回对象的话可以使用  return pageInfo.getList();
        PageHelper.startPage(pageNum,pageSize);
        List<Student> students = studentmapper.queryAllByPage();
        PageInfo<Student> pageInfo = new PageInfo<>(students);
        return pageInfo;

完整demo:

引入pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.huyangfeng</groupId>
    <artifactId>springboot-student-crud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-student-crud</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--JDBC-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>-->
        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis整合springboot-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
        <!--<dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>-->
        <!--mysql连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok:偷懒神器-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
        <dependency><!--导入分页插件-->
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

实体类

Dao接口

数据库 mapper.xml

查询全部的代码

核心代码:

ServiceImpl

package com.xc.service.serviceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xc.mapper.Studentmapper;
import com.xc.pojo.Student;
import com.xc.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private Studentmapper studentmapper;
    @Override
    public PageInfo<Student> queryAllByPage(Integer pageNum, Integer pageSize) {
        //开启分页
        PageHelper.startPage(pageNum,pageSize);
        List<Student> students = studentmapper.queryAllByPage();
        PageInfo<Student> pageInfo = new PageInfo<>(students);
        return pageInfo;
    }
}

控制台Controller

package com.xc.controller;
import com.github.pagehelper.PageInfo;
import com.xc.pojo.Student;
import com.xc.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;
    @RequestMapping("/list")
    public String queryAllByPage(@RequestParam(value = "pageNum",required = false,defaultValue = "1")Integer pageNum,
                                 @RequestParam(value = "pageSize",required = false,defaultValue = "5")Integer pageSize,
                                 Model model){
        PageInfo<Student> studentPageInfo = studentService.queryAllByPage(pageNum, pageSize);
        model.addAttribute("studentPageInfo",studentPageInfo);
        return "list";
    }
}

👯4.1逻辑分页代码实现(第二种自定义分页);

controller 控制台

/**
   *
   * @param
   * @param
   * @return
   * 查询table全部页面
   */
//指定k,v 和默认值(defaultValue )
  @RequestMapping("/selectAllDb")
  @ResponseBody
  public MsgContext selectallDb(@RequestParam(value = "pageNum",name = "pageNum" ,required = false,defaultValue = "1")Integer pageNum,
            @RequestParam(value = "pageSize",name = "pageSize",required = false,defaultValue = "9")Integer pageSize
) {
    MsgContext mc = new MsgContext();
    MyPageInfo<BizDsJdbc> bizDsJdbcVOS = dsService.selectallDb(pageNum,pageSize);
    mc.addResult("data", bizDsJdbcVOS);
    return mc;
  }

接口server

/**
     * 查询展示字段
     * @return
     */
    MyPageInfo<BizDsJdbc> selectallDb(Integer pageNum,Integer pageSize);

实现 impl

/**
    *查看展示信息
    * @return
    */
   @Override
   public MyPageInfo<BizDsJdbc> selectallDb(Integer pageNum,Integer pageSize) {
     //自己的查询全部的代码
     List<BizDsJdbc> bizDsJdbc1 = dsJdbcMapper.selectallDb();
     MyPageInfo<BizDsJdbc> myPageInfo = new MyPageInfo<>(bizDsJdbc1, pageNum, pageSize);
       return myPageInfo;
   }


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL Java 关系型数据库
MyBatis篇-分页
本文介绍了多种分页方式,包括自带rowbound内存分页、第三方插件pagehelper(通过修改SQL实现分页)、SQL分页(依赖limit或rownum等关键字)、数组分页(先查询全部数据再用subList分页)、拦截器分页(自定义拦截器为SQL添加分页语句)。最后总结了逻辑分页(内存分页,适合小数据量)和物理分页(直接在数据库层面分页,适合大数据量)的优缺点,强调物理分页优先于逻辑分页。
|
存储 监控 数据可视化
无需重新学习,使用 Kibana 查询/可视化 SLS 数据
本文演示了使用 Kibana 连接 SLS ES 兼容接口进行查询和分析的方法。
67647 127
|
数据可视化 JavaScript 前端开发
代码可视化平台
这是一个代码可视化工具,旨在简化代码理解过程。用户无需额外配置,直接复制代码即可实时观看执行过程,支持前进后退和动画展示。目前支持JavaScript和Python,未来将扩展更多语言。工具提供了数组、链表、栈、队列、二叉树和哈希表的可视化,并包含辅助函数和自定义注释功能。主要局限在于仅支持单段代码,且执行步数限制为500步。[了解更多](https://staying.fun/zh)
968 20
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
3214 0
|
SQL Java 数据库连接
MyBatis分页查询与特殊字符处理
MyBatis分页查询与特殊字符处理
573 0
MyBatis分页查询与特殊字符处理
|
Java 容器
Swing程序设计(3)JDialog窗体
Swing程序设计(3)JDialog窗体
471 0
|
运维 网络协议 网络安全
干货 | USG配置端口映射图解&amp;映射不通的排查
干货 | USG配置端口映射图解&amp;映射不通的排查
1261 9
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之遇到iava.lang.NoClassDefFoundError: ververica/cdc/common/utils/StrinaUtils错误,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
数据采集 缓存 IDE
Go中遇到http code 206和302的获取数据的解决方案
文章提供了解决Go语言中处理HTTP状态码206(部分内容)和302(重定向)的方案,包括如何获取部分数据和真实请求地址的方法,以便程序员能快速完成工作,享受七夕时光。
1487 0
Go中遇到http code 206和302的获取数据的解决方案
|
SQL Java 数据库连接
Pagehelper超级好用的分页插件
Pagehelper超级好用的分页插件
2973 0