news 2026/8/8 6:38:15

如何添加“默认给Sql查询语句加上租户条件”的功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何添加“默认给Sql查询语句加上租户条件”的功能

从零实现“默认给 SQL 查询语句加上租户条件”的功能,本质上是利用MyBatis Plus的插件机制配合ThreadLocal上下文来实现的。

我们需要构建一条完整的“数据 -> 规则 -> 执行”的链路。以下是标准化的5 步实现指南


第一步:准备“背包” (定义上下文容器)

你需要一个地方在当前线程中存储“当前租户是谁”。

代码核心:利用ThreadLocal

publicclassTenantContextHolder{// 存放当前租户IDprivatestaticfinalThreadLocal<Long>TENANT_ID=newTransmittableThreadLocal<>();publicstaticvoidsetTenantId(LongtenantId){TENANT_ID.set(tenantId);}publicstaticLonggetTenantId(){returnTENANT_ID.get();}publicstaticvoidclear(){TENANT_ID.remove();}}

第二步:制定“规则” (实现 Handler 接口)

你需要告诉 MyBatis Plus 具体的过滤逻辑:租户ID是多少?列名叫什么?哪些表不需要加?

代码核心:实现TenantLineHandler接口。

@ComponentpublicclassMyTenantLineHandlerimplementsTenantLineHandler{// 1. 告诉 MP,当前租户ID是多少 (从背包里拿)@OverridepublicExpressiongetTenantId(){LongtenantId=TenantContextHolder.getTenantId();// 如果没拿到ID(比如没登录),返回 NullValue 可能会导致报错或查不到数据// 通常这里会做判空或者返回默认值returnnewLongValue(tenantId);}// 2. 告诉 MP,数据库里租户列的名字叫什么@OverridepublicStringgetTenantIdColumn(){return"tenant_id";}// 3. 告诉 MP,哪些表需要忽略 (白名单)@OverridepublicbooleanignoreTable(StringtableName){// A. 全局白名单:系统表(字典、菜单)不需要隔离if("sys_dict".equals(tableName)||"sys_menu".equals(tableName)){returntrue;}// B. 动态白名单:配合 @TenantIgnore 注解使用if(TenantContextHolder.isIgnore()){returntrue;}// 默认:必须加过滤条件returnfalse;}}

第三步:组装“引擎” (配置 MyBatis 拦截器)

有了规则(Handler),你需要把它交给执行者(Interceptor),并把执行者放入 MyBatis 的插件链中。

代码核心:配置MybatisPlusInterceptorBean。

@ConfigurationpublicclassMybatisConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(MyTenantLineHandlertenantLineHandler){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();// 核心动作:创建租户拦截器,并注入上面的规则 Handler// ⚠️注意:建议放在分页插件之前interceptor.addInnerInterceptor(newTenantLineInnerInterceptor(tenantLineHandler));// 添加分页插件interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}

第四步:数据“注入” (配置 Web 过滤器)

引擎装好了,但还得有人把燃料(租户ID)塞进第一步的“背包”里。通常是在请求刚进来时处理。

代码核心:实现FilterHandlerInterceptor

@ComponentpublicclassTenantContextFilterimplementsFilter{@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain){try{// 1. 从请求头 Header 获取 tenant-idHttpServletRequestreq=(HttpServletRequest)request;StringtenantIdStr=req.getHeader("tenant-id");if(tenantIdStr!=null){// 2. 塞进 ThreadLocal 背包TenantContextHolder.setTenantId(Long.valueOf(tenantIdStr));}// 3. 放行,执行后续业务逻辑 (Service -> Mapper -> SQL拦截器)chain.doFilter(request,response);}finally{// 4. 【重要】请求结束,清空背包,防止线程污染TenantContextHolder.clear();}}}

🌟 总结:这一套下来发生了什么?

  1. 请求进来:Filter 从 Header 拿到tenant_id=1,存入TenantContextHolder
  2. 业务查询:你写了userMapper.selectList(null)
  3. 拦截改写TenantLineInnerInterceptor拦截 SQL,调用MyTenantLineHandler
  4. 读取规则:Handler 从TenantContextHolder拿到1
  5. SQL 变身:SQL 被自动拼接为SELECT * FROM user WHERE tenant_id = 1
  6. 请求结束:Filter 清空TenantContextHolder

这就是实现“全自动多租户隔离”的完整标准流程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 17:38:48

40、深入探索Perl:系统负载监控与正则表达式应用

深入探索Perl:系统负载监控与正则表达式应用 1. Perl开发突破与CPAN模块 在开发应用程序的过程中,我们取得了重大突破。我们学会了如何接受和验证用户输入,以及如何加载和使用外部模块。通过CPAN(Comprehensive Perl Archive Network),有数百个Perl扩展可供使用,因此学…

作者头像 李华
网站建设 2026/8/7 5:53:38

41、Perl 数据存档与磁盘使用监控应用实践

Perl 数据存档与磁盘使用监控应用实践 1. 数据存档到文件 当我们获取到感兴趣的四条信息后,就可以将这些数据存档到日志文件中。以下是具体操作步骤: 1. 打开文件 :使用 open 命令打开文件,不过这里有个小技巧。在文件名前加上两个大于号 >> ,这会告诉 Per…

作者头像 李华
网站建设 2026/8/7 15:27:00

16、量子计算中的经典模拟与因果模型

量子计算中的经典模拟与因果模型 1. 戈特斯曼 - 尼尔定理的启示 戈特斯曼 - 尼尔定理表明,一定数量的量子操作虽能产生纠缠态,但可被经典高效模拟。这意味着这些操作能以局部因果的方式重新描述。因为戈特斯曼 - 尼尔操作序列等同于在泡利基(X、Y、Z)下对处于泡利基向量态…

作者头像 李华
网站建设 2026/8/6 18:14:44

手把手教你训练自己的情感TTS模型——基于EmotiVoice

手把手教你训练自己的情感TTS模型——基于EmotiVoice 在虚拟主播深情演绎剧情、AI助手用亲人的声音温柔提醒你吃药的今天&#xff0c;语音合成早已不再是“机器念稿”那么简单。用户期待的是有情绪、有温度、甚至“听得见表情”的对话体验。然而&#xff0c;大多数开源TTS系统…

作者头像 李华
网站建设 2026/8/4 9:22:59

EmotiVoice语音合成在语音翻译软件中的情感保留能力探究

EmotiVoice语音合成在语音翻译软件中的情感保留能力探究 在一次跨国远程会议中&#xff0c;一位日本工程师用日语激烈地表达了对项目延期的不满。传统语音翻译系统将他的发言转为英文后&#xff0c;语气却变得平铺直叙&#xff1a;“The project delay is acceptable.” 听起来…

作者头像 李华
网站建设 2026/8/7 0:22:14

EmotiVoice语音韵律建模机制深入剖析

EmotiVoice语音韵律建模机制深入剖析 在智能语音助手越来越“懂人心”的今天&#xff0c;我们已经不再满足于一个只会机械朗读的合成声音。用户期待的是能表达喜怒哀乐、带有个性温度、甚至像真人主播一样富有表现力的语音交互体验。正是在这种需求驱动下&#xff0c;EmotiVoic…

作者头像 李华