mybatis-plus: 多租户隔离机制
文章目录
- 一、TenantLineHandler
- 1、介绍
- 2、包含的方法
- 二、简单实例
- 三、实践
- 1、实现TenantLineHandler接口
一、TenantLineHandler
1、介绍
TenantLineHandler 是 Mybatis-Plus 中用于处理多租户的接口,用于实现多租户数据隔离的具体逻辑。通过实现这个接口,我们可以自定义多租户的处理方式,例如根据不同的租户信息动态拼装 SQL 条件,实现数据的隔离。
2、包含的方法
在 Mybatis-Plus 中,TenantLineHandler 接口包含了以下方法:
- getTenantIdColumn():获取租户 ID 字段名。
- getTenantId():获取当前租户 ID。
- getTenantIdValue():获取租户 ID 的具体数值。
- getTenantIdList():获取租户 ID 列表。
- getTenantIdExpression():获取租户 ID 的 SQL 表达式。
通过实现 TenantLineHandler 接口,并重写以上方法,我们可以根据具体的业务需求来自定义多租户的处理逻辑。例如,可以根据不同的租户 ID 动态拼装 SQL 条件,实现数据的隔离查询。
二、简单实例
面是一个简单示例,展示了如何自定义一个 TenantLineHandler 的实现类:
public class MyTenantLineHandler implements TenantLineHandler {@Overridepublic Expression getTenantId() {// 获取当前租户 IDLong tenantId = getCurrentTenantId();if (tenantId != null) {return new StringValue(String.valueOf(tenantId));} else {return null;}}@Overridepublic String getTenantIdColumn() {// 返回租户 ID 字段名return "tenant_id";}// 自定义方法,获取当前的租户 IDprivate Long getCurrentTenantId() {// 这里可以根据实际情况获取当前的租户 ID,可以从 ThreadLocal、token、session 等地方获取// 这里只是一个示例,实际中需要根据具体的业务逻辑进行实现return 1L;}
}
通过实现 TenantLineHandler 接口并重写其中的方法,我们可以灵活地处理多租户的逻辑,实现数据的隔离查询和操作。
三、实践
1、实现TenantLineHandler接口
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.xxx.ContextHolder;
import com.xxx.TenantConfig;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.schema.Column;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;import java.util.List;
import java.util.Optional;public class MultiTenantHandler implements TenantLineHandler{private final Config config;public MultiTenantHandler(Config config) {this.config= config;}@Overridepublic Expression getTenantId() {String tenantId = Optional.ofNullable(ContextHolder.getTenantId()).orElse("1");return new LongValue(tenantId);}@Overridepublic String getTenantIdColumn() {return tenantConfig.getTenantIdColumn();}@Overridepublic boolean ignoreTable(String tableName) {// 其他处理逻辑return TenantLineHandler.super.ignoreTable(tableName);}@Overridepublic boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);}
}
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
@ConfigurationProperties(prefix = "tenant")
@Data
public class Config {/*** 是否开启多租户*/private Boolean enable = true;/*** 租户id字段名*/private String tenantIdColumn = "tenant_id";/*** 需要忽略的多租户的表,此配置优先filterTables,若此配置为空则启用filterTables*/private List<String> ignoreTables;/*** 忽略指定用户对租户的数据过滤*/private List<String> ignoreLoginNames;/*** 忽略某租户对数据的过滤*/private String ignoreTenantId;}相关文章:
mybatis-plus: 多租户隔离机制
文章目录 一、TenantLineHandler1、介绍2、包含的方法 二、简单实例三、实践1、实现TenantLineHandler接口 一、TenantLineHandler 1、介绍 TenantLineHandler 是 Mybatis-Plus 中用于处理多租户的接口,用于实现多租户数据隔离的具体逻辑。通过实现这个接口&#…...
用Socks5代理游戏,绕过“网络海关”去探险
1. 出海大冒险的开始 在游戏世界,就像在现实生活中一样,有时我们需要越过海洋去探索未知的世界。但是,网络上也有一些“海关”,限制我们访问某些网站或游戏服务器。这就是我们今天要克服的挑战! 2. Socks5代理…...
SpringBoot整合rabbitmq-直连队列,没有交换机(一)
说明:本文章只是springboot和rabbitmq的直连整合,只使用队列生产和消费消息,最简单整合! 工程图: A.总体pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://…...
CUDA C:查看GPU设备信息
相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的,为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数,下面的函数用于查看GPU设备的一切信息。 …...
深度学习如何入门?——从“小白”到“大牛”的深度学习之旅
大家好,今天我要和大家分享的主题是“深度学习如何入门”。深度学习作为人工智能领域的重要分支,已经取得了许多令人瞩目的成果。然而,对于初学者来说,深度学习可能显得有些神秘和难以入手。那么,如何才能快速入门深度…...
编译 qsqlmysql.dll QMYSQL driver not loaded
Qt 连接MySQL数据库,没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图: 安装环境为 VS2019 Qt5.12.12(msvc2017_64、以及源码) 我的安装地址:D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…...
Android日历提醒增删改查事件、添加天数不对问题
Android日历提醒是非常好的提醒功能,笔者在做的过程中,遇到的一些问题,现整理出来,以供参考。 一、申请日历的读写权限 <uses-permission android:name"android.permission.WRITE_CALENDAR" /> <uses-permiss…...
【力扣hot100】刷题笔记Day15
前言 今天要刷的是图论,还没学过,先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择:本节点…...
vue-显示数据
v-text和v-html专门用来展示数据, 其作用和插值表达式类似。v-text和v-html可以避免插值闪烁问题. 当网速比较慢时, 使用{{}}来展示数据, 有可能会产生插值闪烁问题。 插值闪烁: 在数据未加载完成时,页面会显示出原始的{{}}, 过一会才会展示正常数据.语法…...
kali linux常用命令
1. 网络扫描 功能:网络扫描是用来发现网络中的设备、服务和开放端口的过程。 命令:nmap 例子:nmap -sP 192.168.1.0/24 这个命令使用 Nmap 进行网络扫描,列出 192.168.1.0/24 网段中的所有活跃主机。 2. 密码破解 功能…...
HTML5:七天学会基础动画网页4
backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度,第一个值设置宽度,第二个值设置高度,如果只给出一个值,第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度,…...
Web安全之接口鉴权
目录 接口鉴权定义 为什么会有cookie还有session还有token这种技术的存在?...
shardingsphere 集成springboot【水平分表】
创建sharding_sphere数据库 在数据库中创建两张表,t_order_1和t_order_2 分片规则:如果订单编号是偶数添加到t_order_1,如果是奇数添加到t_order_2 创建实体类 public class Order { private Integer id; private Integer orderType; private Int…...
GO 的 Web 开发系列(六)—— 遍历路径下的文件
文件 IO 处理是程序的基础功能,WEB 程序中通过文件 IO 实现附件的上传与下载。在 GO 中,有多种方式可以遍历文件目录,获取文件路径,本文从使用层面上论述这些函数。 预先准备一个包含子目录的目录,用于遍历测试&#…...
Flutter 处理异步操作并根据异步操作状态动态构建界面的方法FutureBuilder
概述 当界面的内容需要依靠网络请求的数据,就需要处理苦恼的,状态是空,非空的逻辑了,不然页面构建可能会报错,而FutureBuilder提供了一个非常好的解决方法,直接看代码 代码 异步操作函数 即网络请求函数…...
Git教程-Git的基本使用
Git是一个强大的分布式版本控制系统,它不仅用于跟踪代码的变化,还能够协调多个开发者之间的工作。在软件开发过程中,Git被广泛应用于协作开发、版本管理和代码追踪等方面。以下是一个详细的Git教程,我们将深入探讨Git的基本概念和…...
Java解决长度为K子的数组中的的最大和
Java解决长度为K子的数组中的的最大和 01 题目 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和: 子数组的长度是 k,且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子…...
【手机端测试】adb基础命令
一、什么是adb adb(Android Debug Bridge)是android sdk的一个工具 adb是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系,才能让用户在电脑上对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人…...
【数据结构】深入探讨二叉树的遍历和分治思想(一)
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要讲述二叉树的递归结构及分治算法的思想。 目录: 🌍前言:🌍…...
jQuery AJAX get() 和 post() 方法—— W3school 详解 简单易懂(二十四)
jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。 HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。 GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据 GET 基本…...
Wan2.2-I2V-A14B效果对比:不同--num_inference_steps对质量影响
Wan2.2-I2V-A14B效果对比:不同--num_inference_steps对质量影响 1. 引言 视频生成技术正在改变内容创作的方式。Wan2.2-I2V-A14B作为一款先进的文生视频模型,能够将文字描述转化为高质量的视频内容。在实际使用中,我们发现--num_inference_…...
OCR + RPA 实战:如何高效处理票据、合同、图片中的非结构化数据
一、为什么非结构化数据这么难搞 企业里到处是这样的场景: • 财务收到一堆发票照片,需要录入系统做报销 • 法务翻找合同扫描件,想快速定位某个条款 • 运营收到用户上传的身份证、营业执照截图,要提取关键信息这些数据都以图片或…...
ResNet + 全注意力机制(Fully Attention)改进方案
ResNet + 全注意力机制(Fully Attention)改进方案 一、为什么要引入全注意力? 传统的ResNet50虽然通过残差连接解决了深层网络的梯度消失问题,但其卷积核的感受野有限,且对所有通道和空间位置一视同仁。这导致了一个问题:网络无法动态聚焦于真正重要的特征。 在实际图…...
告别自研踩坑:Java 技术栈 AI 转型的务实路径
在企业推进 AI 落地的过程中,以 Java 为核心技术栈的传统研发团队普遍面临落地成本高、改造风险大、生态不兼容、运维管理复杂等问题。很多项目因底层架构不匹配、自研试错成本过高,迟迟无法实现规模化落地。围绕这类实际工程痛点,结合企业级…...
Pycharm无法导入conda环境
如果出现conda找不到可执行文件或者加载环境是红色,添加环境中的python.exe没效果,可以试试加入以上conda.exe文件,就可以识别各种环境查找资料可能是因为pycharm版本过高导致。...
【MATLAB源码-第316期】基于matlab的4用户OTFS系统仿真,采用QPSK调制分析误码率与判决阈值的关系,CSI.
操作环境: MATLAB 2022a 1、算法描述 在现代通信系统中,随着移动通信需求的不断增加,多用户通信系统已成为重要的研究方向之一。在众多先进的多用户通信技术中,OTFS(Orthogonal Time Frequency Space)技…...
Dify实战:基于Gemini 2.0 Flash Exp打造智能P图工作流,文字指令秒级修图
1. 为什么你需要这个智能P图工作流? 每次看到朋友圈那些精美的修图作品,你是不是也想过"要是我能轻松做出这种效果就好了"?但打开专业修图软件,面对密密麻麻的工具栏和参数调节,三分钟热度就被浇灭了。这就是…...
【Matlab】MATLAB教程:图像腐蚀imerode函数详解及去噪应用
MATLAB教程:图像腐蚀imerode函数详解及去噪应用 本文基于MATLAB R2020b版本编写(兼容R2018及以上所有版本),聚焦数学形态学核心操作——图像腐蚀,详细讲解imerode函数的语法规则、参数含义,结合多个实操案例演示腐蚀处理流程,并重点突破“腐蚀去除图像噪声点”的核心应…...
别再手动查资料了!用n8n+Ollama本地模型,5分钟搭建一个能聊能查的AI小助手
零成本打造隐私优先的智能助手:n8n与Ollama本地化实战指南 当ChatGPT等云端AI服务成为日常工具时,数据隐私和API成本问题逐渐浮出水面。上周有位金融从业者向我吐槽:"每次和客户讨论方案都要反复确认聊天记录是否包含敏感信息࿰…...
Chart.js项目实战:AI教育模式创新监控系统
Chart.js项目实战:AI教育模式创新监控系统 【免费下载链接】awesome A curated list of awesome Chart.js resources and libraries 项目地址: https://gitcode.com/GitHub_Trending/awesome/awesome Chart.js作为一款强大的数据可视化库,为AI教育…...
