深入 MyBatis-Plus 插件:解锁高级数据库功能

news/2024/11/15 22:38:47/文章来源:https://www.cnblogs.com/ccdm/p/18536490

一、关于Mybatis-Plus插件

1.1 简介

Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。

953921f3-2296-4535-9f98-4d4c3d801e2d

1.2 实现原理

Mybatis-Plus 的插件实现是基于 MyBatis 的拦截器机制, 这些插件通过 MybatisPlusInterceptor​ 来实现对 MyBatis 执行过程的拦截和增强。

MyBatis 插件本质上是对 SQL 执行过程的拦截和扩展,Mybatis-Plus 插件通过在 MyBatis 的执行生命周期中插入拦截器来实现一些增强功能。通过这种方式,Mybatis-Plus 可以实现分页、性能分析、乐观锁等功能的自动化处理。

MybatisPlusInterceptor 概览

MybatisPlusInterceptor​ 是 MyBatis-Plus 的核心插件,它代理了 MyBatis 的 Executor#query​、Executor#update​ 和 StatementHandler#prepare​ 方法,允许在这些方法执行前后插入自定义逻辑。

image

属性

MybatisPlusInterceptor​ 有一个关键属性 interceptors​,它是一个 List<InnerInterceptor>​ 类型的集合,用于存储所有要应用的内部拦截器。

InnerInterceptor 接口

所有 MyBatis-Plus 提供的插件都实现了 InnerInterceptor​ 接口,这个接口定义了插件的基本行为。目前,MyBatis-Plus 提供了以下插件:

  • 自动分页: PaginationInnerInterceptor
  • 多租户: TenantLineInnerInterceptor
  • 动态表名: DynamicTableNameInnerInterceptor
  • 乐观锁: OptimisticLockerInnerInterceptor
  • SQL 性能规范: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor

1.3 配置方式

插件的配置可以在 Spring 配置中进行,也可以在 Spring Boot 项目中通过 Java 配置来添加。以下是两种配置方式的示例:

  • Spring 配置:在 Spring 配置中,需要创建 MybatisPlusInterceptor​ 的实例,并将它添加到 MyBatis 的插件列表中。
  • Spring Boot 配置:在 Spring Boot 项目中,可以通过 Java 配置来添加插件,例如添加分页插件。

Spring Boot 配置示例

@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

配置多个插件

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 添加性能分析插件PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(1000); // 设置SQL最大执行时间,单位为毫秒interceptor.addInnerInterceptor(performanceInterceptor);// 添加防全表更新与删除插件interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());return interceptor;}
}

注意

使用多个插件时,需要注意它们的顺序。建议的顺序是:

  1. 多租户、动态表名
  2. 分页、乐观锁
  3. SQL 性能规范、防止全表更新与删除

总结:对 SQL 进行单次改造的插件应优先放入,不对 SQL 进行改造的插件最后放入。

二、分页插件(PaginationInnerInterceptor​)

2.1 关于

简介

MyBatis-Plus 的分页插件 PaginationInnerInterceptor​ 提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。用时只需要在查询方法中传入Page<T>​对象,插件会自动处理分页相关的SQL构建和结果集解析。

image

主要功能

  1. 自动分页

    • 通过在查询时自动添加 LIMIT​ 和 OFFSET​ 等 SQL 关键字,来实现分页功能。
  2. 兼容性

    • 支持多种数据库的分页语法,确保在不同数据库上都能正常工作。
  3. 动态参数

    • 可以动态地根据用户的请求参数(如页码和每页大小)生成分页信息,而无需手动处理 SQL。
  4. 性能优化

    • 在执行分页查询时,通过设置合理的参数,能够减少查询的时间复杂度,提高查询效率。

关键参数

  • DbType:指定数据库类型,影响生成的分页 SQL 语句。例如,DbType.MYSQL​ 会生成适用于 MySQL 的分页语句。
  • setOverflow:允许配置是否允许请求的页码超出最大页码范围(例如,返回最后一页的数据)。
  • setMaxLimit:可以设置每页最大记录数,避免用户请求过大的分页数据。

2.2 使用

配置插件

@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

分页查询

Page<User> page = new Page<>(1, 10);  // 当前页, 每页记录数
IPage<User> userPage = userMapper.selectPage(page, null);  

三、性能分析插件(PerformanceInterceptor​)

3.1 关于

简介

性能分析插件(PerformanceInterceptor​)是 MyBatis-Plus 提供的一个非常有用的工具,它可以用来监控 SQL 语句的执行时间,帮助开发者及时发现和优化慢查询问题。

3.2 使用

配置插件

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加性能分析插件PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(1000); // 设置SQL最大执行时间,单位为毫秒interceptor.addInnerInterceptor(performanceInterceptor);return interceptor;}
}

配置日志输出

为了更好地监控 SQL 语句的执行情况,可以配置日志输出。在 application.properties​ 或 application.yml​ 文件中添加日志配置:

logging:level:com.baomidou.mybatisplus: DEBUG

  • SQL 执行时间记录:每次执行 SQL 语句时,插件会记录执行时间。
  • 超时处理:如果 SQL 语句的执行时间超过 setMaxTime​ 方法设置的阈值(默认为 0,表示不限制),插件会记录一条警告日志或抛出异常,具体行为取决于配置。

如果 SQL 语句执行时间超过设定的阈值,日志输出可能如下所示:

2024-11-08 10:41:00 [http-nio-8080-exec-1] WARN  c.b.mybatisplus.extension.plugins.inner.PerformanceInterceptor - [performance] SQL Execution Time: 1500 ms

通过以上步骤,你可以在 MyBatis-Plus 中轻松配置和使用性能分析插件,帮助你及时发现和优化慢查询问题。

四、防全表更新与删除插件(BlockAttackInterceptor​)

4.1 关于

简介

MyBatis-Plus 提供了一个防全表更新与删除插件(BlockAttackInterceptor​),该插件可以防止在没有 WHERE 条件的情况下执行全表更新或删除操作,从而避免误操作导致的数据丢失或损坏

使用

配置插件

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加防全表更新与删除插件interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());return interceptor;}
}

测试

在控制器层中调用 Service 层的方法进行查询。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/delete-all")public String deleteAllUsers() {try {userService.remove(null); // 尝试删除所有用户return "All users deleted successfully";} catch (Exception e) {return "Failed to delete all users: " + e.getMessage();}}@PostMapping("/update-all")public String updateAllUsers() {try {User user = new User();user.setName("Updated Name");userService.updateById(user); // 尝试更新所有用户return "All users updated successfully";} catch (Exception e) {return "Failed to update all users: " + e.getMessage();}}
}
  1. 尝试删除所有用户:访问 /users/delete-all​ 接口。

    • 如果没有 WHERE 条件,插件会抛出异常并阻止删除操作。

    • 控制台输出示例:

      Failed to delete all users: Cannot execute delete operation without where condition!
      
  2. 尝试更新所有用户:访问 /users/update-all​ 接口。

    • 如果没有 WHERE 条件,插件会抛出异常并阻止更新操作。

    • 控制台输出示例:

      Failed to update all users: Cannot execute update operation without where condition!
      

五、自定义插件

如果内置插件不能满足需求,可以自定义插件。自定义插件需要实现 Interceptor​ 或 InnerInterceptor​ 接口,并在 intercept​ 方法中实现自定义逻辑。

示例:

import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;import java.sql.Connection;@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class CustomInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 自定义逻辑System.out.println("CustomInterceptor: Before SQL execution");Object result = invocation.proceed();System.out.println("CustomInterceptor: After SQL execution");return result;}@Overridepublic Object plugin(Object target) {return Interceptor.super.plugin(target);}@Overridepublic void setProperties(Properties properties) {Interceptor.super.setProperties(properties);}
}

注册自定义插件:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new CustomInterceptor());return interceptor;
}

通过上述机制和接口,MyBatis-Plus 提供了灵活的插件扩展能力,使开发者可以根据具体需求定制化功能。

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

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

相关文章

【RStudio 2024 软件下载与安装教程】

1、安装包RStudio 2024: 链接:https://pan.quark.cn/s/9c0b51619c36 提取码:acvG RStudio 2022: 链接:https://pan.quark.cn/s/2e59b185b557 提取码:MHdf 2、安装教程 1) 双击R-4.4.2-win.exe安装,弹窗安装对话框2) 选择语言,点击确定3) 点击下一步…

强化学习理论-第二课-贝尔曼公式

1. return和贝尔曼上图说明从不同状态出发得到的return,依赖于从其他状态出发的returnv是return,将第一张图写成矩阵的形式,r代表immediate reward,是已知的,矩阵P是策略加上state transition,也是已知的,求解v 这个公式实际上就是贝尔曼公式在\(S_t\)采用什么样的动作\…

为了`小米互联`升级big sur, 但是无用

起了个大早,升级到big sur,为了小米互联take some photos about upgrading macOS from 10.15.7 to 11.6.5about 1hour....dmg From hyperos.mi.com doesn’t work.Xiaomi HyperConnect 跨端智联app from appStore , incompatiablemy mac info ☁ Downloads neofetchc. …

OFA-Sys/chinese-clip-vit-base-patch16 占用显存测试

model.get_image_features(inputs)64 batch_size 2096MB 取消with torch.no_grad():后 8GB占满 16 batch_size 3886MBAutoModel .from_pretrained(MODEL_NAME) 执行慢,原因是需要启用网络代理,否则总是卡在验证阶段DataLoader 增加num_workers后 torch.cuda.OutOfMemoryError…

java 中都有哪些引用类型

强引用(Strong Reference):Java中默认声明的就是强引用,例如:​​Object obj = new Object();​​ 只要强引用存在,垃圾回收器将永远不会回收被引用的对象 ,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的…

类加载的执行过程

类加载的执行过程是Java虚拟机(JVM)将类文件从磁盘加载到内存,并进行验证、准备、解析和初始化等一系列操作的过程。这个过程可以分为以下几个阶段: 1. 加载根据查找路径找到相应的 class 文件然后导入;2. 验证检查加载的 class 文件的正确性;3. 准备给类中的静态变量分…

请问PbootCMS获取结果页面的搜索keyword值和tag值

问题:PbootCMS如何获取结果页面的搜索关键词和tag值? 答案:搜索关键词keyWord:如果搜索结果页面地址后缀为?keyword=三角形,则获取关键词方式为{$get.keyword} tag关键词:如果搜索结果页面地址后缀为/tag/伪静态配置.HTML,则获取关键词方式为{$get.tag} 其他页面:获取…

PbootCMS模板如何调用当前位置面包屑标签

PbootCMS模板如何调用当前位置面包屑标签标签:{pboot:position}参数说明:separator=*:分隔符,非必填,默认为>>indextext=*:首页文本,非必填,默认为"首页"扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HT…

织梦修改后的网站,织梦CMS内容管理与优化

织梦CMS(DedeCMS)是一款流行的开源内容管理系统,以下是一些内容管理和优化的步骤:登录后台:打开网站的后台管理页面,输入用户名和密码登录。编辑内容:在后台的“内容管理”模块中,找到需要编辑的文章或页面。 点击“编辑”按钮,进行内容修改。发布新内容:在“发布文章…

织梦网站怎么修改自定义,织梦自定义字段管理

在织梦CMS中,自定义字段可以帮助你扩展文章或页面的属性,以下是一些管理自定义字段的步骤:登录后台:打开织梦CMS的后台管理页面,输入用户名和密码登录。进入模型管理:在后台左侧菜单中,点击“核心” > “频道模型” > “管理内容模型”。选择模型:选择需要添加自…

怎么修改企业网站排版,企业网站排版调整指南

调整企业网站的排版可以显著改善用户体验和品牌形象。以下是一些基本步骤:需求分析:确定您希望达到的效果,比如提高转化率、增强品牌形象等。 备份网站:在进行任何重大更改之前,确保备份当前网站的所有文件和数据库,以防万一。 选择合适的工具:如果您使用的是CMS,大多数…

CF1945题解

CF1945A 贪心简单题 先把b自己内部组合,再考虑与c组合 CF1945B 简单题数学题 因为在0m的时间内一定能覆盖所有的情况,所以对0m的时间内最多烟花数进行小学2年纪计算即可 CF1945C 简单题 枚举每一个断点,记录答案即可 CF1945D 挺好玩的一道贪心题。 转化一下式子,我们发现 \…