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

MybatisPlus开启多租户三步快速集成

前言

        记录mybatisPlus集成多租户实现数据逻辑隔离

步骤一

yml添加配置:标红字段名取决设置表的租户字段

tenant:# 是否开启租户模式enable: true# 需要排除的多租户的表exclusionTable:- "dp_im_user_friend"# 租户字段名称column: tenant_id

步骤二


import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;import java.util.List;/*** 白名单配置*/
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "tenant")
public class TenantProperties {/*** 是否开启租户模式*/private Boolean enable;/*** 多租户字段名称*/private String column;/*** 需要排除的多租户的表*/private List<String> exclusionTable;
}

注:getTenantId()方法 从当前请求上下文中获取租户ID ,这里简单返回固定值9527,实际应从用户会话中获取

package com.macro.mall.config.tenant;import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.macro.mall.config.MybatisPlusConfig;
import lombok.RequiredArgsConstructor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.NullValue;
import net.sf.jsqlparser.expression.StringValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 多租户配置中心*/
@Configuration
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@AutoConfigureBefore(MybatisPlusConfig.class)
public class TenantConfig {private final TenantProperties tenantProperties;/*** 新多租户插件配置,一缓和二缓遵循mybatis的规则,* 需要设置 MybatisConfiguration#useDeprecatedExecutor = false* 避免缓存万一出现问题** @return TenantLineInnerInterceptor*/@Beanpublic TenantLineInnerInterceptor tenantLineInnerInterceptor() {return new TenantLineInnerInterceptor(new TenantLineHandler() {/*** 获取租户ID* @return Expression*/@Overridepublic Expression getTenantId() {//从请求获取登录用户的租户idString tenantId = "9527";if (tenantId != null) {return new StringValue(tenantId);}return new NullValue();}/*** 获取多租户的字段名* @return String*/@Overridepublic String getTenantIdColumn() {return tenantProperties.getColumn();}/*** 过滤不需要根据租户隔离的表* 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件* @param tableName 表名*/@Overridepublic boolean ignoreTable(String tableName) {return tenantProperties.getExclusionTable().stream().anyMatch((t) -> t.equalsIgnoreCase(tableName));}});}
}

步骤三


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.macro.mall.config.tenant.TenantProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author luoyq* @date 2025/3/14 22:15* @description:*/
@Configuration
public class MybatisPlusConfig {@Autowiredprivate  TenantLineInnerInterceptor tenantLineInnerInterceptor;@Autowiredprivate TenantProperties tenantProperties;/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//多租户插件if (tenantProperties.getEnable()) {interceptor.addInnerInterceptor(tenantLineInnerInterceptor);}interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 这里添加 SQL 性能分析插件,用来打印 SQL 和执行时间// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}}

验证结果:调用方法查看打印sql是否携带租户字段完结撒花!!!


文章转载自:

http://Ht4aQS2q.bLjcb.cn
http://SDm0gmad.bLjcb.cn
http://J1ygRFV4.bLjcb.cn
http://XTfHd1Df.bLjcb.cn
http://WMjltBGN.bLjcb.cn
http://L2udwyoS.bLjcb.cn
http://GI85ECQW.bLjcb.cn
http://EtPi8a3h.bLjcb.cn
http://NgZpHa6I.bLjcb.cn
http://lAvko5yq.bLjcb.cn
http://YlhBICFn.bLjcb.cn
http://hhyxeTIR.bLjcb.cn
http://zUFxUtHj.bLjcb.cn
http://SqQrCubE.bLjcb.cn
http://MLuyTUVx.bLjcb.cn
http://MjYY3MsF.bLjcb.cn
http://iIVxcrh7.bLjcb.cn
http://7xNCALvA.bLjcb.cn
http://RWyYPeCe.bLjcb.cn
http://dbHne5fX.bLjcb.cn
http://EjgeQJnd.bLjcb.cn
http://cIyjIuNW.bLjcb.cn
http://c7WVXshT.bLjcb.cn
http://PvUnaY6U.bLjcb.cn
http://ALHK8uLt.bLjcb.cn
http://M8nY5FXE.bLjcb.cn
http://UXvtxEEf.bLjcb.cn
http://trnJG5j4.bLjcb.cn
http://UsLepqIH.bLjcb.cn
http://jCdXEB7Y.bLjcb.cn
http://www.dtcms.com/a/372884.html

相关文章:

  • 现代Web应用前后端架构设计与Python实战
  • YOLO介绍(1)
  • 【javaSE】String类
  • 9.渗透-.Linux基础命令(一)(有vi编辑器)
  • LeetCode - LCR 179. 查找总价格为目标值的两个商品
  • ArcGIS Pro 遇到严重的应用程序错误而无法启动
  • 轻松Linux-9.进程间通信
  • 20250908的学习笔记
  • Golang 与 gRPC
  • shareId 的产生与传递链路
  • Go语言实战案例-开发一个JSON格式校验工具
  • AI技术架构与GEO算法原理如何重塑搜索引擎可见性
  • 【AI测试前沿】谷歌Fuzzing安全测试Go语言指南
  • 佰力博检测与您探讨薄膜样品如何测介电常数?
  • jsBridge接入流程
  • TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
  • ArrayList中的源码解析
  • 详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣
  • 大数据Spark(六十三):RDD-Resilient Distributed Dataset
  • 云原生TodoList Demo 项目,验证云原生核心特性
  • C语言爬虫开发:常见错误与优化方案
  • Linux 应急响应实操 Checklist
  • 【PCIe EP 设备入门学习专栏 -- 8.2.3 Local Bus Controller (LBC) 详细介绍】
  • 将基于 Oracle JDK 17 开发的 Spring Boot 3.2.12 项目迁移到 OpenJDK 17 环境
  • Vue的计算属性
  • Redis 非缓存核心场景及实例说明
  • 食品罐头(铝罐)表面缺陷数据集:8k+图像,4类,yolo标注
  • 云计算系统安全
  • 微信群机器人-备份文件发送通知
  • Linux-条件变量