当前位置: 首页 > article >正文

深度解析:MyBatis-Plus实现分页查询的封装!

全文目录:

    • 开篇语
    • 前言
    • 摘要
    • 概述
      • 什么是分页查询?
      • 为什么选择 MyBatis-Plus?
      • 本文目标
    • 源码解析
      • 分页插件核心逻辑
    • 使用案例分享
      • 1. 配置 MyBatis-Plus 分页插件
      • 2. 定义分页查询方法
      • 3. Controller 层调用
    • 应用场景案例
    • 优缺点分析
      • 优点
      • 缺点
    • 核心类方法介绍
    • 测试用例
    • 小结
    • 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在上期内容中,我们深入探讨了 MyBatis-Plus 的基础使用和核心功能,包括其增强版 CRUD 操作、内置 SQL 方法以及与 MyBatis 的无缝兼容。这些特性极大地简化了 Java 开发者日常处理数据库操作的代码量。然而,在实际的开发场景中,仅仅依赖这些基础功能是不够的,分页查询作为最常见的数据查询需求之一,对 MyBatis-Plus 的分页功能封装则成为项目开发中不可或缺的一部分。

本期内容,我们将聚焦 MyBatis-Plus 的分页查询封装。通过剖析其核心实现,结合源码解析和实战案例,带领大家从理论到实操全面掌握这一技能。不仅如此,我们还将探索分页封装的优缺点及优化策略,帮助开发者更高效地满足复杂业务需求。


摘要

分页查询是现代软件开发中几乎必不可少的功能,尤其在大数据处理的场景中更显重要。MyBatis-Plus 提供了强大的分页插件,可以快速实现分页功能,而通过对分页查询的封装,能够进一步提高代码复用性和维护性。本篇文章将详细介绍 MyBatis-Plus 分页功能的实现方法、源码解析、使用案例及应用场景。最后,我们还会从优缺点分析、核心方法解读和测试用例的设计入手,全面总结 MyBatis-Plus 分页封装的最佳实践。


概述

什么是分页查询?

分页查询是一种将数据分块显示的技术,通常用于解决海量数据在前端展示时的性能问题。通过分页查询,用户可以分批次查看数据,同时减少对数据库资源的占用。

为什么选择 MyBatis-Plus?

MyBatis-Plus 是 MyBatis 的增强版,它以极少的学习成本为 MyBatis 提供了丰富的功能扩展,例如自动 CRUD、条件构造器、分页插件等。特别是分页功能,MyBatis-Plus 通过插件机制实现了对 SELECT 查询语句的自动处理,开发者只需简单配置即可完成分页功能。

本文目标

  • 理解 MyBatis-Plus 分页插件的工作原理
  • 掌握分页查询的封装技巧
  • 通过实战案例学习最佳实践
  • 深入分析封装后的优缺点和改进方向

源码解析

在 MyBatis-Plus 中,分页功能的核心实现依赖于 分页插件(PaginationInterceptor)和分页对象 Page。接下来我们通过源码剖析其核心原理。

分页插件核心逻辑

MyBatis-Plus 的分页插件会在 SQL 执行前自动拦截查询语句,并在语句末尾追加分页条件。其执行流程大致如下:

  1. 拦截 SQL 执行
    PaginationInnerInterceptor 通过 MyBatis 的拦截器机制拦截 SELECT 查询语句。

  2. 解析分页参数
    根据用户传入的分页对象(如 Page),获取分页参数(如当前页、每页条数)。

  3. 追加分页 SQL
    LIMITOFFSET 条件附加到原始 SQL。

  4. 返回分页结果
    执行分页后的 SQL,返回分页后的数据以及总记录数。

分页插件的核心源码片段如下:

@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {// 1. 检查是否需要分页if (rowBounds instanceof Page<?>) {Page<?> page = (Page<?>) rowBounds;// 2. 获取分页参数long current = page.getCurrent();long size = page.getSize();// 3. 拼接分页 SQLString originalSql = boundSql.getSql();String paginatedSql = originalSql + " LIMIT " + (current - 1) * size + ", " + size;// 4. 替换 SQLReflectionUtil.setFieldValue(boundSql, "sql", paginatedSql);}
}

使用案例分享

1. 配置 MyBatis-Plus 分页插件

在 Spring Boot 项目中,可以通过配置类引入分页插件:

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

2. 定义分页查询方法

通过分页插件和分页对象 Page,可以轻松实现分页查询:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public IPage<User> getUsersByPage(int page, int size) {Page<User> userPage = new Page<>(page, size);return userMapper.selectPage(userPage, null);}
}

3. Controller 层调用

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/list")public IPage<User> listUsers(@RequestParam int page, @RequestParam int size) {return userService.getUsersByPage(page, size);}
}

应用场景案例

  1. 后台管理系统
    在后台系统中,例如用户管理、订单管理等模块,分页查询是必不可少的功能,用于高效显示列表数据。

  2. 电商平台
    在商品展示页面,通过分页显示商品列表可以优化前端性能并减轻后端压力。

  3. 日志分析系统
    日志数据量大且更新频率高,通过分页封装实现高效的数据查询和展示。


优缺点分析

优点

  • 高效便捷:基于 MyBatis-Plus 提供的分页插件,分页查询的实现变得简单易用。
  • 低耦合:通过封装,业务代码与分页逻辑解耦,便于维护。
  • 高扩展性:可以灵活扩展分页查询的条件。

缺点

  • 依赖插件机制:分页插件深度绑定到 MyBatis-Plus,难以适配其他 ORM 框架。
  • 大数据性能限制:对于超大数据量分页查询,仍需优化 SQL 或采用更高效的方案。

核心类方法介绍

  1. Page<T>
    MyBatis-Plus 提供的分页对象,用于封装分页参数和结果。

    • Page<T>(long current, long size):指定当前页和每页条数。
    • getRecords():获取分页结果。
    • getTotal():获取总记录数。
  2. PaginationInnerInterceptor
    分页插件的核心类,负责拦截和修改 SQL。


测试用例

使用 JUnit 测试分页查询功能:

@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetUsersByPage() {IPage<User> page = userService.getUsersByPage(1, 10);Assertions.assertNotNull(page.getRecords());Assertions.assertTrue(page.getTotal() > 0);}
}

小结

通过本文的学习,我们详细了解了 MyBatis-Plus 分页插件的实现原理,并通过源码解析和实战案例,掌握了如何封装分页查询功能。这种封装不仅提高了开发效率,还增强了代码的可读性和复用性。


总结

分页查询作为 Web 开发中的常见需求,其重要性不言而喻。MyBatis-Plus 的分页插件以其简单、高效的特性,成为 Java 开发者的首选工具。通过本篇文章的学习,我们从基础配置到源码剖析,从使用案例到优缺点分析,全面掌握了 分页查询的封装技巧

未来的开发中,我们可以在此基础上优化分页查询的性能,并探索更复杂的分页需求。希望本文能为您带来启发,助您在开发的道路上更加游刃有余!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

相关文章:

深度解析:MyBatis-Plus实现分页查询的封装!

全文目录&#xff1a; 开篇语前言摘要概述什么是分页查询&#xff1f;为什么选择 MyBatis-Plus&#xff1f;本文目标 源码解析分页插件核心逻辑 使用案例分享1. 配置 MyBatis-Plus 分页插件2. 定义分页查询方法3. Controller 层调用 应用场景案例优缺点分析优点缺点 核心类方法…...

第05章 14 绘制人脸部的PolyData并使用小圆锥体来展现法线

在VTK中&#xff0c;绘制人脸部的PolyData并使用小圆锥体来展现法线是一个常见的任务。这个过程可以通过以下步骤实现&#xff1a; 读取人脸部的PolyData&#xff1a;可以使用VTK的读取模块读取一个包含人脸部的.vtk或.obj文件。计算法线&#xff1a;使用VTK的vtkPolyDataNorm…...

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

2000-2020年各省第二产业增加值占GDP比重数据

2000-2020年各省第二产业增加值占GDP比重数据 1、时间&#xff1a;2000-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围&#xff1a;31省 5、指标解释&#xff1a;第二产业增加值占GDP比重…...

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…...

【C语言分支与循环结构详解】

目录 ---------------------------------------begin--------------------------------------- 一、分支结构 1. if语句 2. switch语句 二、循环结构 1. for循环 2. while循环 3. do-while循环 三、嵌套结构 结语 -----------------------------------------end----…...

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…...

初阶2 类与对象

本章重点 上篇1.面向过程和面向对象初步认识2.类的引入---结构体3.类的定义3.1 语法3.2 组成3.3 定义类的两种方法&#xff1a; 4.类的访问限定符及封装4.1 访问限定符4.2封装---面向对象的三大特性之一 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小 8.this指…...

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…...

Python的那些事第三篇:Python编程的“调味料”与“交流术”运算符与输入输出

运算符与输入输出&#xff1a;Python编程的“调味料”与“交流术” 在编程的世界里&#xff0c;Python不仅仅是一门语言&#xff0c;它更像是一位充满智慧的厨师&#xff0c;而运算符和输入输出则是它手中的“调味料”和“交流术”。没有这些工具&#xff0c;代码就会像没有加…...

如何利用AI工具来进行数据分析

利用AI工具进行数据分析可以显著提高效率和准确性&#xff0c;以下是详细步骤和方法&#xff1a; 1. 明确分析目标 在开始数据分析之前&#xff0c;首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果&#xff0c;以及选择合适的AI工具和方法。 2. …...

深度剖析C++17中的std::optional:处理可能缺失值的利器

文章目录 一、基本概念与设计理念二、构建与初始化&#xff08;一&#xff09;默认构造&#xff08;二&#xff09;值初始化&#xff08;三&#xff09;使用std::make_optional&#xff08;四&#xff09;使用std::nullopt 三、访问值&#xff08;一&#xff09;value()&#x…...

MySQL用户授权、收回权限与查看权限

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...

每日一题 429. N 叉树的层序遍历

429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...

【Maui】注销用户,采用“手势”点击label弹窗选择

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 方法一&#xff1a;前端绑定3.2 方法二&#xff1a;后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创…...

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格&#xff0c;并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码&#xff08;部分&#xff09; 本文测试代码已上传&#xff0c;路径如下&#xff…...

Object类(2)

大家好&#xff0c;今天我们继续来看看Object类中一些成员方法&#xff0c;这些方法在实际中有很大的用处&#xff0c;话不多说&#xff0c;来看。 注&#xff1a;所有类都默认继承Object类的&#xff0c;所以可调用Object类中的方法&#xff0c;如equals&#xff0c;也可以发生…...

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…...

无用的知识又增加了:is_assignable means?

std::pair的默认operator被delete掉了&#xff0c;取而代之的是两个enable_if版本。 为什么这么设计&#xff0c;我的理解是在std::map里&#xff0c;已经保存的元素的key值是不能被修改的&#xff0c;比如 注意&#xff0c;下面的代码会修改key值&#xff0c;编译时出现错误…...

MOS的体二极管能通多大电流

第一个问题&#xff1a;MOS导通之后电流方向可以使任意的&#xff0c;既可以从D到S&#xff0c;也可以从S到D。 第二个问题&#xff1a;MOS里面的体二极管电流可以达到几百安培&#xff0c;这也就解释了MOS选型的时候很少考虑体二极管的最大电流&#xff0c;而是考虑DS之间电流…...

C语言【基础篇】之流程控制——掌握三大结构的奥秘

流程控制 &#x1f680;前言&#x1f99c;顺序结构&#x1f4af; 定义&#x1f4af;执行规则 &#x1f31f;选择结构&#x1f4af;if语句&#x1f4af;switch语句&#x1f4af;case穿透规则 &#x1f914;循环结构&#x1f4af;for循环&#x1f4af;while循环&#x1f4af;do -…...

Node.js下载安装及环境配置教程 (详细版)

Node.js&#xff1a;是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型&#xff0c;使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序&#xff0…...

【PySide6拓展】QCalendarWidget 日历控件

文章目录 PySide6拓展&#xff1a;QCalendarWidget 日历控件前言什么是QCalendarWidget&#xff1f;特点&#xff1a; 如何使用QCalendarWidget&#xff1f;1. 基本用法2. 获取当前选中的日期 QCalendarWidget 常用函数分类介绍1. 日期选择与管理函数2. 日期格式与显示函数3. 日…...

新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…...

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊…...

Maya快捷键

旋转 ALT鼠标左键 平移 ALT鼠标中键 缩放 ALT鼠标右键 / 滑动鼠标滚轮 切换视图 空格键 [Q] 选择状态 [W] 移动状态 [E] 旋转状态 [R] 绽放状态 1正常显示 2正常也圆滑同时显示 3圆滑显示 4线框显示 5材质显示 6贴图显示 7灯光显示 CTRLZ 撤销命令…...

Go反射指南

概念&#xff1a; 官方对此有个非常简明的介绍&#xff0c;两句话耐人寻味&#xff1a; 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条&#xff0c;再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条&#xff0c;很有喜感的自嘲…...

深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile

深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性&#xff0c;广泛用于实现回调、动态函数调用以及灵活的程序设计。然而&#xff0c;复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发&#xff0c;逐步解析复杂…...

【观察】甲骨文:以AI为中心,开启企业级平台架构“新革命”

知名科技杂志《连线》创始主编凯文凯利曾预测&#xff1a;“在未来的 100 年里&#xff0c;人工智能将超越任何一种人工力量&#xff0c;将人类引领到一个前所未有的时代。” 可以看到&#xff0c;随着近两年AIGC与大模型的快速爆发&#xff0c;AI在千万行业中的重要性愈发突出…...