Mybatis实现分页功能

news2024/11/24 2:45:16

1、关于逻辑分类和物理分页

分页可分为逻辑分页物理分页

  • 逻辑分页是一次性把全部数据查询加载进内存 ,然后再进行分页。这样优点是减少IO次数,适合频繁访问、数据量少的情况。缺点是不适合大数据量,容易造成内存溢出。
  • 物理分页是利用limit语法在数据库中进行分页。他的优点是适合分页大数据量数据。缺点是频繁查询数据库,消耗性能。

 

 2、Mybatis实现分页功能

mybatis实现分页有三种方式

  1. 直接使用SQL语句,利用limit关键字分页(物理分页)
  2. RowBounds(逻辑分页)
  3. 第三方插件PageHelper(物理分页)

 

环境:spring boot+mybatis

 

2.1  SQL语句实现分页

limit语法 limit [offset,] rows

offset 偏移量,从第条数据分页,默认为0

rows 行数,要拿多少数据

 在mapper接口中

    @Select("select count(*) from role")
    int allRoleCount();

    @Select("select * from role limit #{offset},#{rows}")
    List<Role>  pageRole(int offset,int rows);
    @Autowired
    private RoleMapper roleMapper;    

    //sql分页
    @Test
    public void test2(){
        int pageNum = 3;  //查第几页
        int pageSize = 3;  //每页几条数据

        int count = roleMapper.allRoleCount();  //总条数
        //计算出:共有多少页、这页的偏移量offset是多少
        int pagesNum = (count / pageSize) + 1;  //共有多少页
        int offset = (pageNum - 1) * pageSize;  //偏移量
        List<Role> roles = roleMapper.pageRole(offset,pagesNum);
        System.out.println(roles);
        //最后把分页数据封装到Page类中返回,这里不做演示
    }

这种方式缺点是比较麻烦,要自己计算分页数据和封装Page类。优点是自定义性强。

2.2  RowBounds实现分页

在mapper接口中

    @Select("select count(*) from role")
    int allRoleCount();

    @Select("select * from role")
    List<Role>  pageRowBoundsRole(RowBounds rowBounds);
    //RowBounds分页
    @Test
    public void test3(){
        int pageNum = 1;  //查第几页
        int pageSize = 3;  //每页几条数据

        int count = roleMapper.allRoleCount();  //总条数
        //计算出:共有多少页、这页的偏移量offset是多少
        int pagesNum = (count / pageSize) + 1;  //共有多少页
        int offset = (pageNum - 1) * pageSize;  //偏移量

        RowBounds rowBounds = new RowBounds(offset,pageSize);
        List<Role> roles = roleMapper.pageRowBoundsRole(rowBounds);
        System.out.println(roles);
        //最后把分页数据封装到Page类中返回,这里不做演示
    }

2.3 第三方插件PageHelper

 导入第三方依赖包

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>
    //PageHelper
    @Test
    public void test1(){
        PageHelper.startPage(1, 3);
        List<Role> roles = roleMapper.allRole();
        System.out.println(roles);
        PageInfo<Role> pageInfo = new PageInfo<>(roles);
        System.out.println(pageInfo.getNextPage());  //下一页
        System.out.println(pageInfo.getPrePage());  //上一页
        System.out.println(pageInfo.getPageNum());  //当前页
        System.out.println(pageInfo.getPageSize());  //每页多少条
        System.out.println(pageInfo.getSize());  //当前页的条数
        System.out.println(pageInfo.getTotal());  //总条数
        System.out.println(pageInfo.getPages());  //总页数
    }

 这种方式最喜欢了😍😘😘😘,不用计算,也不用自己封装。

 仅一行代码就可以做到分页功能了,真的太神奇了!

他的原理大概是:在PageHelper.startPage()方法中把分页数据存储到ThreadLocal中,然后利用PageInterceptor拦截roleMapper.allRole()SQL执行方法,然后从ThreadLocal中取出分页参数进行SQL语句limit拼接。

 

3、MybatisPlus实现分页功能 

  • 内置分页查询mybatis-plus(物理分页)
  • PageHelper(物理分页)

环境:spring boot+mybatis plus 

 

 3.1 内置分页查询 

 在BaseMapper中定义了两种内置分页查询方法

 两个的区别:

selectPage返回对象数组

selectMapsPage返回Map数组

 

 先配置添加分页拦截器PaginationInnerInterceptor 

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //定义mp拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //添加分页的拦截器
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        return mybatisPlusInterceptor;
    }
}
    //内置分页查询
    @Test
    public void selectByPage(){
        IPage page = new Page(1,2);
        roleDao.selectPage(page, null);
        System.out.println("当前页:"+page.getCurrent());
        System.out.println("每页显示数:"+page.getSize());
        System.out.println("总条数:"+page.getTotal());
        System.out.println("总页数:"+page.getPages());
        System.out.println("数据:"+page.getRecords());  //[Role(id=4, roleName=项目经理, dec=null, deleted=0, version=2), Role(id=5, roleName=测试工程师2, dec=null, deleted=0, version=1)]
    }

    //内置分页查询
    @Test
    public void selectMapsByPage(){
        IPage page = new Page(1,2);
        roleDao.selectMapsPage(page, null);
        System.out.println("当前页:"+page.getCurrent());
        System.out.println("每页显示数:"+page.getSize());
        System.out.println("总条数:"+page.getTotal());
        System.out.println("总页数:"+page.getPages());
        System.out.println("数据:"+page.getRecords());//[{role_name=项目经理, deleted=0, id=4, version=2}, {role_name=测试工程师2, deleted=0, id=5, version=1}]
    }

3.2 第三方PageHelper分页助手

 和mybatis使用差不多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android JVM 原理简析

当我们在开发 Android 应用程序时&#xff0c;我们实际上是在使用 Java 编程语言编写代码&#xff0c;并将其编译为在 Android 上运行的字节码。这些字节码最终在 Android 设备上的 Java 虚拟机&#xff08;JVM&#xff09;中执行。 Android JVM的意义 学习 Android JVM&#…

Java基础知识面试题

Java概述 何为编程 编程就是使用某种程序设计语言编写程序代码让计算机解决某个问题 为了使计算机能够理解人的意图&#xff0c;人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得计算机能够根据人的指令一步一步去工作&a…

Spring相关API

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

WebRTC-STUN协议详解

1、STUN协议概述 STUN&#xff08;Session Traversal Utilities for NAT&#xff09;NAT会话穿透工具&#xff0c;STUN是一个Client/Server协议&#xff0c;支持请求/响应类型、指示类型两种类型。STUN作为ICE&#xff08;Interactive Connectivity Establishment&#xff0c;…

【需求实现】输入多少就输出多少的拟合任务如何实现(一):数据集分割

神经网络中输入多少数据就输出多少数据的情况如何实现 导读数据集长什么样&#xff1f;怎么分割数据集&#xff1f;时间窗口分析模板我知道你很急&#xff0c;但你先别急 换个思路 导读 在实习的过程中遇到了这样一种需求&#xff1a;给定一条序列&#xff0c;并另外给定一条期…

使用ffmpeg将rtsp流转流实现h5端播放

主要实现rtsp转tcp协议视频流播放 ffmpeg下载安装&#xff08;公认业界视频处理大佬&#xff09; a、官网地址&#xff1a;www.ffmpeg.org/ b、gitHub&#xff1a;github.com/FFmpeg/FFmp… c、推荐下载地址&#xff1a;ffmpeg.zeranoe.com/builds/ (选择如下图) 2.配置ffmpeg…

期末复习【计算机系统结构】

期末复习【计算机系统结构】 前言推荐押题公式 期末复习重点第1章 计算机体系结构的基本概念1.3 定量分析技术1.3.1计算机系统设计的定量原理 第2章 计算机指令集结构第3章 流水线技术3.2 流水线的性能指标3.2.1 吞吐率3.2.2 加速比3.2.3 效率3.2.4 流水线性能分析举例 3.3 流水…

miniconda的安装

1. conda 是一个开源的包、环境管理器&#xff0c;可以用于在同一个机器上安装不同版本的软件包及其依赖&#xff0c;并能够在不同的环境之间切换。 miniconda官网下载 miniconda清华镜像下载 找到自己想要安装的版本&#xff0c;我这里选择的是Miniconda3-4.7.12.1-Linux-x…

OUC编译原理实验报告 实验4:验证Yacc的使用/实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译

编译原理实验报告 实验4&#xff1a;验证Yacc的使用 实验e4&#xff1a;从语言SUM到栈式计算机STACK的机器语言的翻译 中国海洋大学编译原理实验2023春 仅供同学参考思路 请勿直接抄袭 否则可能喜提0分 目录 文章目录 编译原理实验报告目录一.实验目的二.实验内容实验4实验…

多进程爬虫实战-摩托车网

前言 最近有遇到很多私信让我讲一讲多进程的爬虫&#xff0c;我发现大家对爬虫的框架写法和进程的理解有很多的问题和疑问&#xff0c;这次就带来一个小实战让大家理解多进程爬虫以及框架的写法 由于进程爬虫会对任何服务器都有一定的影响&#xff0c;本文仅供学习交流使用&…

【Linux后端服务器开发】C程序预处理

目录 一、源文件到可执行程序的过程 二、预定义符号 三、#define宏定义 四、条件编译 一、源文件到可执行程序的过程 预处理&#xff1a;去注释&#xff0c;宏替换&#xff0c;头文件展开&#xff0c;条件编译编译&#xff1a;c语言 ---> 汇编语言&#xff08;语法分析…

JUC高级-0625

13. AbstractQueuedSynchronized之AQS 13.1 前置知识 公平锁和非公平锁可重入锁自旋思想LockSupport数据结构之双向链表设计模式之模板设计模式 13.2 AQS入门级别理论知识 AQS是什么&#xff1f; 字面意思&#xff1a;抽象的队列同步器&#xff0c;实现了通知唤醒的机制源代…

8通道250MSPS采样率16位AD采集FMC子卡-高速数据采集专家

FMC128是一款8通道250MHz采样率16位分辨率AD采集FMC子卡&#xff0c;符合VITA57.1规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;8通道AD将模拟信号数字化后通过高带宽的FMC连接器&#xff08;HPC&#xff09;连接至FPGA&#xff0c;从而大大降低了系统信…

电力智能运维是什么?有哪些优势?

设备检修维护是指对设备和系统进行必要的监视、维修和养护&#xff0c;通过日常的维护使设备保持良好的状态&#xff0c;确保设备安全、稳定、经济运行。由于时代的变迁&#xff0c;电力设备的检测维修变得也越来越智能化。采用的智能运维系统&#xff0c;可以更好的监控电力设…

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页 1.1 B/S架构 B/S架构&#xff1a;浏览器/服务器 程序完全部署在服务器上使用浏览器访问服务器无需单独安装客户端软件 为什么要使用B/S架构 B/S与C/S比较B/S架构C/S架构软件安装浏览器需要专门的客户端应用升级维护客户…

NGINX PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案

NGINX & PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案 1 / 说明 基于安全的考虑&#xff0c;需要给cookie加上Secure和HttpOnly属性&#xff0c;HttpOnly比较好理解&#xff0c;设置HttpOnlytrue的cookie不能被js获取到&#xff0c;无法用document.coo…

linux系统的文件等相关操作命令

文章目录 1 查找文件&#xff08;find、grep&#xff09;2 查看文件内容&#xff08;cat、more、less、head、tail&#xff09;3 文件比较&#xff08;diff&#xff09;4 文本编辑器&#xff08;vi、vim&#xff09;5 文件压缩与解压&#xff08;tar、tar.tgz、zip、rar、rar.g…

yum安装 lnmp

目录 一.nginx 的yum安装 1.关闭防火墙 2. 安装 nginx 3.安装依赖包 4.启动服务 二. 安装 mysql 5.7 (mariadb) 1.nysal的yum安装 2. 启动服务 3.在日志文件中找出root用户的初始密码 4.登录 mysql 5. 停止版本更新&#xff0c;稳定数据库的运行 三.php 的yum安装 1.…

rust abc(4): 定义变量并使用 mut 关键字

文章目录 1. 目的2. 不可变变量 (immutable variable)2.1 含义2.2 代码实例 3. 可变变量 (mutable variable)3.1 含义3.2 代码实例 4. 总结 1. 目的 学习 rust 语言中变量的定义方式&#xff0c; 包括普通变量&#xff08;immutable&#xff09;、可变变量&#xff08;mutable…

轻量云服务器(香港)ping不通怎么解决?

​  在使用轻量云服务器(香港)时&#xff0c;有时候会出现ping不通的情况&#xff0c;这时候我们该怎么办呢? 首先&#xff0c;我们需要知道 ping 不通的原因。 ping 是一种基于 ICMP 协议的网络测试工具&#xff0c;它可以用来测试网络连接的质量和速度。如果 ping 不通&am…