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

Mybatis-Plus 插件机制与自定义插件实现

1. Mybatis-Plus 插件系统概述

Mybatis-Plus 提供了一个简单而强大的插件机制,允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制,用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现,能够在 MyBatis 执行 SQL 语句前、后进行自定义操作。

插件机制的核心是 Interceptor 接口,开发者可以通过实现该接口,自定义拦截 SQL 执行的行为。Mybatis-Plus 内置了多个常用插件,例如分页插件、性能分析插件等。插件的配置和使用非常简单,能够提升开发效率,减少重复性代码。

2. 常见插件:分页插件,性能分析插件
  • 分页插件

    分页插件是 Mybatis-Plus 中最常用的插件之一,它通过拦截 SQL 查询语句,自动为查询添加分页条件。只需在配置中启用分页插件,并在查询时传入分页参数,就能够快速实现分页查询。

    配置分页插件的代码如下:

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

    在查询时,使用 Page 对象作为分页参数:

    Page<User> page = new Page<>(1, 10);  // 第1页,每页10条
    IPage<User> userPage = userMapper.selectPage(page, null);
    
  • 性能分析插件

    性能分析插件用于输出 SQL 执行的性能日志。通过该插件,可以记录每个 SQL 的执行时间,并警告执行时间超过设定阈值的 SQL 语句。它的配置方式如下:

    @Configuration
    public class MybatisPlusConfig {@Beanpublic PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor interceptor = new PerformanceInterceptor();interceptor.setMaxTime(1000); // 设置最大执行时间,超过则警告interceptor.setFormat(true);  // SQL 格式化输出return interceptor;}
    }
    
3. 如何实现自定义插件

要实现自定义插件,首先需要实现 MyBatis 的 Interceptor 接口,该接口包含一个 intercept 方法,用于定义拦截逻辑。在 intercept 方法中,可以通过 Invocation 对象来获取当前的 SQL 语句,并进行自定义操作。

以下是一个自定义插件的实现示例:

public class MyCustomPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 获取执行的 SQL 语句MappedStatement ms = (MappedStatement) invocation.getArgs()[0];BoundSql boundSql = ms.getBoundSql(invocation.getArgs()[1]);// 在此处修改 SQL,例如增加特定的查询条件String sql = boundSql.getSql();String modifiedSql = sql + " WHERE is_active = 1"; // 假设为筛选活跃用户// 设置修改后的 SQLField field = BoundSql.class.getDeclaredField("sql");field.setAccessible(true);field.set(boundSql, modifiedSql);return invocation.proceed();}@Overridepublic Object plugin(Object target) {// 通过 MyBatis 的插件机制包装目标对象if (target instanceof StatementHandler) {return Plugin.wrap(target, this);}return target;}@Overridepublic void setProperties(Properties properties) {// 可以根据需要在此配置插件的属性}
}

然后,需要将自定义插件配置到 MyBatis 中:

@Configuration
public class MybatisPlusConfig {@Beanpublic MyCustomPlugin myCustomPlugin() {return new MyCustomPlugin();}
}
4. 插件的开发与使用场景
  • 插件开发

    插件的开发通常基于以下几个步骤:

    1. 实现 Interceptor 接口,重写 interceptpluginsetProperties 方法。
    2. intercept 方法中编写 SQL 拦截逻辑,修改或记录 SQL 执行信息。
    3. 使用 Plugin.wrap 方法将插件与目标对象进行绑定,以便 MyBatis 能够正确调用插件。
    4. 配置插件,将其注册到 MyBatis 的插件列表中。
  • 插件的使用场景

    • 动态 SQL 扩展:可以利用插件动态地添加查询条件,例如自动增加租户字段、权限过滤等。
    • SQL 性能监控:通过性能分析插件可以检测 SQL 执行的性能,帮助开发者优化查询。
    • 审计日志:通过插件记录每次 SQL 执行的信息,可以实现数据库的审计功能。
    • 数据加密解密:在插件中进行数据加密解密处理,保证数据的安全性。
5. SaaS 系统的应用场景:租户数据隔离插件

在 SaaS 系统中,通常会有多个租户(客户),而每个租户的数据必须进行隔离,避免数据泄漏或混合。这时,Mybatis-Plus 插件机制可以发挥重要作用,通过自定义插件来自动为每个 SQL 查询添加租户隔离条件。

假设系统中的每个租户都有一个唯一的 tenant_id,我们可以通过自定义插件,在所有的查询中自动添加租户 ID 条件,从而实现数据的隔离。以下是一个租户数据隔离插件的示例:

public class TenantDataIsolationPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 获取执行的 SQL 语句MappedStatement ms = (MappedStatement) invocation.getArgs()[0];BoundSql boundSql = ms.getBoundSql(invocation.getArgs()[1]);// 获取当前租户的 tenant_id,假设通过 ThreadLocal 存储String tenantId = TenantContext.getTenantId();// 为每个 SQL 增加租户字段条件String sql = boundSql.getSql();// 如果查询的表没有 tenant_id 字段,不需要添加租户过滤条件if (!isTenantIdRequired(ms)) {return invocation.proceed(); // 跳过插件处理,直接执行查询}String modifiedSql = sql + " AND tenant_id = '" + tenantId + "'"; // 设置修改后的 SQLField field = BoundSql.class.getDeclaredField("sql");field.setAccessible(true);field.set(boundSql, modifiedSql);return invocation.proceed();}@Overridepublic Object plugin(Object target) {// 通过 MyBatis 的插件机制包装目标对象if (target instanceof StatementHandler) {return Plugin.wrap(target, this);}return target;}@Overridepublic void setProperties(Properties properties) {// 可以根据需要在此配置插件的属性}/*** 判断当前查询的表是否需要租户隔离。* 例如,如果表中没有 tenant_id 字段,则不需要隔离。*/private boolean isTenantIdRequired(MappedStatement ms) {String tableName = ms.getSqlCommandType().name();// 假设查询表的名字中包含 "no_tenant" 时,表示不需要隔离return !tableName.contains("no_tenant");}
}

在这个插件中,我们假设每次操作的 tenant_id 是通过 TenantContext.getTenantId() 方法获取的(可以利用 ThreadLocal 存储每个线程的租户 ID)。插件会在每个 SQL 查询中自动加上租户条件 AND tenant_id = '当前租户ID',但如果查询的表没有 tenant_id 字段,或者表名包含 no_tenant(例如某些不需要数据隔离的表),插件将跳过租户隔离的处理,直接执行查询。

配置插件:

@Configuration
public class MybatisPlusConfig {@Beanpublic TenantDataIsolationPlugin tenantDataIsolationPlugin() {return new TenantDataIsolationPlugin();}
}

应用场景

  • 在 SaaS 系统中,每个租户的数据会存储在相同的数据库表中。通过该插件,开发者无需手动在每个查询中添加租户 ID 条件,系统自动为每个 SQL 查询注入当前租户的 ID,从而实现数据隔离。
  • 对于一些不需要租户隔离的表(如系统表、公共配置表等),通过 isTenantIdRequired 方法判断,避免不必要的条件添加。
  • 该插件不仅适用于查询,还可以用于增、删、改操作,确保所有操作都符合租户隔离的要求。
总结

Mybatis-Plus 插件机制通过提供灵活的拦截功能,可以有效地扩展 MyBatis 的功能。通过自定义插件,开发者能够实现如动态 SQL 扩展、SQL 性能监控、数据加密解密等功能。在 SaaS 系统中,使用插件实现租户数据隔离,是一种非常实用的解决方案,可以减少开发工作量,提高系统的可维护性和安全性。此外,针对不需要隔离的表,我们可以在插件中进行智能判断,避免无意义的条件添加,提升系统效率。

相关文章:

Mybatis-Plus 插件机制与自定义插件实现

1. Mybatis-Plus 插件系统概述 Mybatis-Plus 提供了一个简单而强大的插件机制&#xff0c;允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制&#xff0c;用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现&a…...

开源表单、投票、测评平台部署教程

填鸭表单联合宝塔面板深度定制,自宝塔面板 9.2 版本开始,在宝塔面板-软件商店中可以一键部署填鸭表单系统。 简单操作即可拥有属于自己的表单问卷系统,快速赋能业务。即使小白用户也能轻松上手。 社区版体验地址:https://demo.tduckapp.com/home 前端项目地址: tduck-fro…...

行为模式---命令模式

概念 命令模式是一种行为设计模式&#xff0c;它的核心思想就是将请求封装为一个对象&#xff0c;此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦&#xff0c;支持请求的排队、记录、撤销等操作。 使用场景 1、…...

zabbix配置邮件告警

目录 实现步骤&#xff1a; 实现目的&#xff1a; 1.在监控端操作&#xff1a; 2.web界面部署 ​​​​​​​实现步骤&#xff1a; 1、在 zabbix服务端配置邮件发送脚本和修改 zabbix服务端配置文件; 2、在 zabbix前端控制台进行相关设置。 实现目的&#xff1a; Zab…...

INI和CSV文件保存

INI文件 INI文件是一种配置文件格式&#xff0c;通常用于Windows操作系统中的应用程序中。 它是一种文本文件&#xff0c;由多个节和键值对组成&#xff0c;用于存储应用程序的配置信息。 INI文件的特点包括&#xff1a; INI文件是一种文本文件&#xff0c;易于编辑和阅读。…...

汽车智能钥匙中PKE低频天线的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被动式无钥匙进入系统&#xff0c;汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用&#xff0c;以下是其具体作用&#xff1a; 信号交互与身份认证 低频信号接收&#xff1a;当车主靠近车辆时…...

计算机等级考试

一、计算机等级考试——题库 &#xff08;1&#xff09;选择题 &#xff08;2&#xff09;基本操作题 &#xff08;3&#xff09;上网题 &#xff08;4&#xff09;文字题 &#xff08;5&#xff09;表格题 &#xff08;6&#xff09;演示文稿题 二、计算机等级考试——标准评…...

Geotools中获取Shapefile的属性表格字符集编码的一种方法

目录 前言 1、字符集编码的重要性 2、Geotools 在 GIS 开发中的地位 一、GeoTools的字符集知识 1、字符集的作用 2、shapefile中字符集信息 二、GeoTools中获取字符集的方法 1、默认获取 2、从DataStore中获取 3、从CPG文件中获取 4、生产字符获取实践 三、总结 前言…...

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…...

Scrapy爬虫框架介绍

目录 什么是Scrapy Scrapy核心组件 Scrapy扩展组件 组件交互流程 安装Scrapy Scrapy项目目录结构说明 创建Scrapy项目 创建爬虫 运行爬虫 配置请求头 全局配置请求头 指定爬虫配置请求头 配置管道pipeline 全局配置pipeline 方式一&#xff1a;指定爬虫配置pipe…...

Stable Diffusion模型高清算法模型类详解

Stable Diffusion模型高清算法模型类详细对比表 模型名称核心原理适用场景参数建议显存消耗细节增强度优缺点4x-UltraSharp残差密集块(RDB)结构优化纹理生成真实人像/建筑摄影重绘幅度0.3-0.4&#xff0c;分块尺寸768px★★★★★☆皮肤纹理细腻&#xff0c;但高对比场景易出现…...

软考网络安全口诀

首先&#xff0c;我们来看第一个口诀 “防御为先&#xff0c;安全无小事”。这个口诀强调了网络安全中的防御意识。在软考备考过程中&#xff0c;我们需要深刻理解网络安全不仅仅是技术层面的问题&#xff0c;更是一种全面的防御思维。从网络架构设计到日常运维管理&#xff0…...

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…...

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后&#xff0c; npm config set registry https://registry.npmmirror.com# 安装vue相关工具&#xff0c;webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…...

Python项目-基于深度学习的校园人脸识别考勤系统

引言 随着人工智能技术的快速发展&#xff0c;深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支&#xff0c;已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...

浅谈C++函数特性

C的函数特性 前言 在C中&#xff0c;函数加入了许多特性&#xff0c;例如&#xff1a;a、函数缺省参数 b、函数重载 c、内联函数 等等……&#xff0c;这里我会和大家详细去探讨这些特性。以及探讨这些特性的一些细节&#xff0c;同时在内联部分&#xff0c;我们还会把C语言的…...

Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)

一、箱图 箱图&#xff08;Box Plot&#xff09;&#xff0c;又称为箱形图、箱线图、盒式图、盒状图或盒须图&#xff0c;是一种用于展示数据分布情况的统计图表 箱图通过显示数据的中位数、上下四分位数&#xff08;Q1和Q3&#xff09;、异常值和数据的分布范围&#xff0c;提…...

高性能PHP框架webman爬虫引擎插件,如何爬取数据

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【2025年后端开发终极指南:云原生、AI融合与性能优化实战】

一、2025年后端开发的五大核心趋势 1. 云原生架构的全面普及 云原生&#xff08;Cloud Native&#xff09;已经成为企业级应用的核心底座。通过容器化技术&#xff08;DockerKubernetes&#xff09;和微服务架构&#xff0c;开发者能够实现应用的快速部署、弹性伸缩和故障自愈…...

健康养生:开启活力人生的钥匙

在这个瞬息万变的时代&#xff0c;人们愈发珍视健康。健康养生&#xff0c;宛如一把神奇的钥匙&#xff0c;为我们打开通往活力人生的大门&#xff0c;全方位呵护身心&#xff0c;提升生活品质。 从饮食层面看&#xff0c;均衡膳食是核心。每餐力求包含碳水化合物、蛋白质、脂…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...