【MyBatisPlus 分页插件解析】

文章目录

  • 一、MyBatis Plus 和分页插件简介
    • 1.1 MyBatis Plus 简介
      • CRUD操作简化
      • 动态SQL
      • 分页功能
    • 1.2 分页插件的重要性
      • 提升用户体验
      • 提高数据处理效率
  • 二、分页插件的使用
    • 2.1 引入分页插件
    • 2.2 配置分页插件
    • 2.3 使用分页查询
  • 三、分页插件的原理
    • 3.1 内部工作机制
    • 3.2 物理分页与逻辑分页的区别
  • 四、高级特性
    • 4.1 自定义分页
      • 实现自定义分页查询
      • 示例
    • 4.2 分页插件的性能优化

一、MyBatis Plus 和分页插件简介

1.1 MyBatis Plus 简介

MyBatis Plus 是一个为了简化开发、提高效率而生的 MyBatis 增强工具。它在保留了 MyBatis 原生操作的基础上,额外提供了强大的 CRUD 操作接口、自动填充、动态 SQL 语句构建以及优化器等功能。其目的是减少开发者的重复工作量,让开发者能够更专注于业务逻辑的实现。

CRUD操作简化

通过引入通用 Mapper 和 Service 层的概念,MyBatis Plus 能够极大简化传统的 CRUD(Create, Read, Update, Delete)操作。开发者仅需定义少量的接口和注解即可实现大部分数据库操作,大幅度减少了样板代码的编写。

动态SQL

MyBatis Plus 提供了 Lambda 表达式和动态 SQL 构建器,使得 SQL 语句的编写变得更加灵活和直观。这不仅提升了代码的可读性,也让复杂查询的构建变得简单。

分页功能

MyBatis Plus 通过内置的分页插件支持物理分页,不仅使用简单,而且效率高,避免了大量数据一次性加载导致的性能问题。

1.2 分页插件的重要性

在现代 Web 应用中,数据分页是一个不可或缺的功能。随着数据量的日益增长,无论是从服务器处理还是用户体验的角度考虑,将大量数据分批次、分页展示已成为一种必要的选择。

提升用户体验

对于用户而言,分页可以极大地提高页面的加载速度,避免一次性加载过多数据导致的长时间等待。分页展示也使得用户可以更加方便地浏览和定位数据,提升了整体的用户体验。

提高数据处理效率

对于服务器而言,分页查询可以显著减少一次查询返回的数据量,降低数据库的压力,避免因数据过多导致的内存溢出等问题。同时,它也减轻了网络传输的负担,提高了数据处理的整体效率。

二、分页插件的使用

2.1 引入分页插件

要使用 MyBatis Plus 分页插件,首先需要在项目的 pom.xml 文件中引入相关的依赖。MyBatis Plus 通过 mybatis-plus-boot-starter 提供了包括分页插件在内的所有基础功能,因此只需添加以下依赖即可:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本</version>
</dependency>

这里的 <version> 标签应替换为最新的 MyBatis Plus 版本号。

2.2 配置分页插件

  1. 配置数据源:确保数据源已经配置正确。

  2. 配置 MyBatis Plus:包括在 application.propertiesapplication.yml 文件中设置 MyBatis Plus 的一些基础属性。

  3. 注册分页插件:MyBatis Plus 3.0 及以上版本自动支持分页,不需要进行额外配置。但如果需要自定义分页行为,可以通过创建一个配置类来实现:

@Configuration
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}

PaginationInterceptor 是 MyBatis Plus 分页插件的核心,通过注册这个 Bean启用分页功能。

2.3 使用分页查询

查询第一页的5条用户记录,其中用户的年龄等于18岁。

@Autowired
private UserMapper userMapper;public void examplePageQuery() {Page<User> page = new Page<>(1, 5); // 创建分页对象,当前页为1,每页显示5条记录IPage<User> userPage = userMapper.selectPage(page, new QueryWrapper<User>().lambda().eq(User::getAge, 18));System.out.println(userPage.getRecords()); // 打印查询结果
}

Page 对象是分页查询的核心,它不仅包含了分页参数(如当前页和每页记录数),还会在查询执行后包含一些额外的分页信息,例如总记录数和总页数。selectPage 方法执行分页查询,并返回一个包含查询结果的 IPage 对象。

三、分页插件的原理

3.1 内部工作机制

MyBatis Plus 分页插件的核心工作原理是通过 MyBatis 的拦截器(Interceptor)机制实现的。当执行分页查询时,分页插件作为一个拦截器插入到了 SQL 执行过程中,对查询进行了改写和增强,实现了分页功能。

  1. 拦截查询操作:当执行一个分页查询时,分页插件首先拦截这个查询操作。这一步骤通常在 MyBatis 执行 SQL 之前发生。

  2. 解析分页参数:分页插件解析传入的 Page 对象,提取出分页参数,例如当前页号和每页显示的记录数。

  3. 改写原始 SQL:根据不同数据库的分页语法,分页插件会将原始 SQL 改写为包含分页查询语句的 SQL。例如,对于 MySQL,它会添加 LIMITOFFSET 子句。

  4. 执行改写后的 SQL:执行改写后的分页 SQL 语句,获取当前页的数据。

  5. 查询总记录数:除了获取当前页数据外,分页插件还会自动构造并执行一个查询总记录数的 SQL 语句,以便计算总页数和总记录数。

  6. 封装分页结果:最后,分页插件会将查询结果以及分页信息(如总记录数、总页数)封装到 IPage 对象中,返回给调用者。

3.2 物理分页与逻辑分页的区别

分页可以分为两种类型:物理分页和逻辑分页。

  • 物理分页:在数据库层面上实现分页,仅查询出当前页需要展示的数据。这意味着分页操作是通过 SQL 语句在数据库执行的,如通过 LIMITOFFSET 子句。物理分页能够有效减少网络传输的数据量,并降低内存消耗,适用于处理大量数据。

  • 逻辑分页:在内存中对数据集进行分页,通常是先查询出所有数据,然后在应用层面上进行数据的切割和展示。逻辑分页简单但在处理大量数据时会导致性能问题,因为它需要一次性加载所有数据到内存中。

MyBatis Plus 分页插件采用的是物理分页。这种方式通过在数据库层面上直接执行分页查询,只返回查询页的数据,从而避免了一次性加载大量数据带来的内存压力和性能下降。物理分页的这种实现方式使得 MyBatis Plus 分页插件在处理大规模数据集时表现出良好的性能和效率。

四、高级特性

4.1 自定义分页

在某些情况下,自动生成的分页查询可能无法满足特定的业务需求,此时可以通过自定义分页查询的 SQL 语句来进行优化或特殊处理。

实现自定义分页查询

  1. 定义自定义查询方法:在 Mapper 接口中定义一个方法,用于执行自定义的分页查询。这个方法接收分页参数和其他查询条件。

  2. 使用 @Select 注解:利用 MyBatis 的 @Select 注解在方法上直接编写 SQL 语句。如果 SQL 语句特别复杂,也可以使用 XML 配置文件来编写。

  3. 应用分页参数:在 SQL 语句中正确应用分页参数,如 LIMITOFFSET(MySQL),确保可以根据请求的页码和页面大小进行数据的物理分页。

  4. 返回自定义分页结果:执行自定义 SQL 后,可以手动封装分页结果或利用 MyBatis Plus 提供的分页结果处理功能,将查询结果转换为分页对象(如 IPage)。

示例

@Mapper
public interface CustomMapper {@Select("SELECT * FROM user WHERE status = #{status} LIMIT #{page.size}, #{page.current}")IPage<User> selectCustomPage(IPage<?> page, @Param("status") String status);
}

selectCustomPage 方法实现了一个简单的自定义分页查询,根据用户状态进行筛选。

4.2 分页插件的性能优化

  • 合理使用索引:确保对分页查询中涉及的字段建立适当的索引,尤其是 WHERE 子句中的条件字段和 ORDER BY 子句中的排序字段。

  • 减少每页数据量:适当减少每页显示的记录数可以减轻数据库的负担,提高查询速度。

  • 避免SELECT * 查询:指定需要查询的列,而不是使用 SELECT *,可以减少网络传输的数据量和数据库的I/O压力。

  • 延迟加载非必要字段:对于大字段(如文本、图片),考虑使用延迟加载或单独查询,以免影响主查询的性能。

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

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

相关文章

Netty 实现dubbo rpc

一、RPC 的基本介绍 RPC (Remote Procedure Call) 远程过程调用&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无需额外的为这个交互编程。也就是说可以达到两个或者多个应用程序部署在不同的服务器上&…

HOOPS Visualize:工业级3D可视化SDK,打造移动端和PC端工程应用程序

HOOPS Visualize是一种高性能的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;旨在帮助开发人员轻松构建和集成高质量的3D可视化功能。这是一种全功能的&#xff0c;以工程为重点的场景图技术&#xff0c;我们称为Core Graphics。Core Graphics可集成到一个框架中&…

webpack从零到1 构建 vue3

为什么要手写webpack 不用cli &#xff08;无的放矢&#xff09;并不是 其实是为了加深我们对webpack 的了解方便以后灵活运用webpack 的技术 初始化项目结构&#xff08;跟cli 结构保持一致&#xff09; 新建 public src 等文件夹npm init -y 创建package.json文件tsc --init…

opencv基础篇 ——(十一)常用照片处理函数

改善图像的亮度(illuminationChange) 用于改善光照条件不佳导致的图像对比度低下或局部过暗/过亮的问题。该函数通过模拟全局和局部光照变化&#xff0c;旨在提高图像的整体视觉质量&#xff0c;特别是在低光照条件下&#xff0c;使得图像中的重要细节更加清晰可见。 函数原型…

IDEA Maven项目,控制台出现乱码的问题

前言 使用idea进行maven项目的编译时&#xff0c;控制台输出中文的时候出现乱码的情况。 通常出现这样的问题&#xff0c;都是因为编码格式不一样导致的。既然是maven出的问题&#xff0c;我们在idea中查找下看可以如何设置文件编码。 第一种方式 在pom.xml文件中&#xff…

nginx--系统参数优化telenct

系统参数 在生产环境中&#xff0c;根据自己的需求在/etc/sysctl.conf来更改内核参数 net.ipv4.ip_nonlocal_bind 1 允许非本地IP地址socket监听 net.ipv4.ip_forward 1 开启IPv4转发 net.ipv4.tcp_timestamps 0 是否开启数据包时间戳 net.ipv4.tcp_tw_reuse 0 端⼝口复⽤…

代码随想录-算法训练营day34【贪心算法04:柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第八章 贪心算法 part04● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球 详细布置 860.柠檬水找零 本题看上好像挺难&#xff0c;其实挺简单的&#xff0c;大家先尝试自己做一做。 https…

企业外贸邮箱有哪些?国内五大外贸邮箱排行榜

外贸公司在进行跨国业务的时候&#xff0c;需要一个稳定安全的企业邮箱。国内的企业外贸邮箱提供商有很多&#xff0c;目前排行在前五的有Zoho Mail企业邮箱、阿里企业邮箱、网易企业邮箱、腾讯企业邮箱、新浪企业邮箱&#xff0c;今天我们就来详细了解下这些邮箱产品。 一、Z…

【yolov8 项目打包】pyinstaller 打包pyQt5 界面为exe

创建一篇博客文章&#xff0c;介绍如何使用PyInstaller将PyQt5界面打包为exe文件&#xff0c;并且处理与YOLOv8模型相关的文件&#xff0c;可以按照以下结构进行&#xff1a; 标题&#xff1a;使用PyInstaller将PyQt5界面与YOLOv8模型打包为Windows可执行文件 引言 在机器学习…

MySQL以其他表作为条件更新指定表

在MySQL数据库管理中,经常需要根据另一个表的数据来更新指定表中的记录。这种操作涉及到多表联合查询和更新语句的结合,是数据库操作中较为复杂且实用的技能之一。本文将深入介绍如何利用MySQL的​​UPDATE​​​语句结合​​INNER JOIN​​​、​​LEFT JOIN​​等联接类型,…

Unity Material(材质)、Texture(纹理)、Shader(着色器)简介

文章目录 一、概念二、Rendering Mode三、Main Maps三、参考文章 一、概念 Material(材质)&#xff1a;物体的“色彩”、“纹理”、“光滑度”、“透明度”、“反射率”、“折射率”、“发光度”等&#xff0c;材质的本质是shader的实例(载体)Texture(贴图)&#xff1a;附件到…

Python通过定义类实现增删改查(期末考试)

python高级编程期末测试 别看我挣的少&#xff0c;但是我省的多&#xff0c;昨天法拉利又省下两百多万。 一、通过创建自己类来实现增删改查 我们已经利用模型实现单表的增删改查了 现在 我们不想使用模型来操作数据库 我们可以自己定义模型 那么 如何通过自己创建的类实现增…

一对多的数据查找与更新

需求 SQLserver数据库生产的mes的代码和erp系统的代码是一对多的关系&#xff0c;需要根据创建时间、更新时间、erp代码排序&#xff0c;每个mes取第一条但是使用子查询的话&#xff0c;子查询中是不允许使用排序的 解决思路 可以使用SQL的窗口函数&#xff08;如ROW_NUMBER()&…

计算机SCI期刊,IF=9.657,1区TOP,2周内出版!

一、期刊名称 Neural Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;7.8 中科院分区&#xff1a;1区TOP 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支付$3350 三、期刊简介 神…

美国原装二手keysight86122c安捷伦86122C波长计

是德KEYSIGHT 86122C 波长计 主要功能和规格 特征&#xff1a; 增强型&#xff0c;稳定的HeNe参考激光器&#xff0c;使用寿命更长 包括五年保修&#xff0c;涵盖整个仪器&#xff0c;所有零件 绝对波长精度&#xff1a;0.2 ppm 差分波长精度&#xff1a;0.15 ppm 不到0.…

Springboot+vue项目影城管理系统

摘 要 本论文主要论述了如何使用JAVA语言开发一个影城管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述影城管理系统的当前背景以及系统开发的目的&…

lucene中Collector类、CollectorManager类区分和用法

我的lucene版本是9.10.0&#xff0c;请说明Collector类、CollectorManager类区分和用法&#xff0c;尽量详细点 在 Lucene 9.10.0 中&#xff0c;Collector 类和 CollectorManager 类都是用于搜索结果的收集和处理 Collector 类 Collector 类是一个接口&#xff0c;用于收集…

正点原子Linux学习笔记(六)在 LCD 上显示 jpeg 图像

在 LCD 上显示 jpeg 图像 20.1 JPEG 简介20.2 libjpeg 简介20.3 libjpeg 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 20.4 libjpeg 使用说明错误处理创建解码对象设置数据源读取 jpeg 文件的头信息设置解码处理参数开始解码读取数据结束解码释放/销毁解码对象 …

【动态规划】子数组、子串系列I|最大子数组和|环形子数组的最大和|乘积最大子数组|乘积为正数的最长子数组长度

一、最大子数组和 最大子数组和 算法原理&#xff1a; &#x1f4a1;细节&#xff1a; 1.返回值为dp表每个位置的最大值&#xff0c;而不是只看最后一个位置&#xff0c;因为可能最后一个位置都不选 2.可以直接在填dp表的时候就进行返回值的比较 3.如果初始化选择多开一个位…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 一、无限debugger的…