news 2026/8/25 1:34:41

如何添加“默认给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/24 17:50:54

1.2 人工智能的多维度定义:弱AI、强AI与超级AI的理论边界

1.2 人工智能的多维度定义&#xff1a;弱AI、强AI与超级AI的理论边界 在厘清“智能”的本质之后&#xff0c;对“人工智能”&#xff08;Artificial Intelligence&#xff09;这一概念本身的界定便成为一项关键任务。人工智能并非一个内涵单一的术语&#xff0c;其外延涵盖了从…

作者头像 李华
网站建设 2026/8/25 7:40:34

26、量子计算与高维空间探索

量子计算与高维空间探索 1. 超几何与量子可视化的基础 在量子研究领域,超几何的概念有着重要的地位。庞加莱在其“位置分析”文章中提到的“超几何”,后来发展成了拓扑学领域。然而,拓扑学中常见的图形,如环面、贝塞尔曲线、多孔环面和裤子形状等,难以让我们直观地想象出…

作者头像 李华
网站建设 2026/8/24 19:48:40

基于EmotiVoice的游戏角色语音定制方案设计

基于EmotiVoice的游戏角色语音定制方案设计 在现代游戏开发中&#xff0c;NPC不再只是站桩念台词的背景板。玩家期待的是能“动情”的角色——愤怒时语气骤紧、悲伤时语速放缓、惊喜时音调上扬。这种情感化的交互体验&#xff0c;正逐渐成为衡量一款游戏沉浸感的重要标尺。然而…

作者头像 李华
网站建设 2026/8/25 7:40:31

15、应对 OWASP 十大安全风险的实用指南

应对 OWASP 十大安全风险的实用指南 在当今数字化时代,Web 应用程序面临着各种各样的安全威胁。为了确保应用程序的安全性,我们需要了解并应对常见的安全风险。本文将介绍 OWASP(Open Web Application Security Project)十大安全风险中的部分风险,并提供相应的缓解措施和最…

作者头像 李华
网站建设 2026/8/24 19:25:32

LobeChat可用性99.9%保障措施

LobeChat 可用性 99.9% 的背后&#xff1a;高可用架构如何支撑生产级 AI 聊天 在今天&#xff0c;用户早已不再满足于“能用”的 AI 聊天工具——他们需要的是始终在线、快速响应、断线不丢记录、模型切换无感的体验。尤其当企业将大语言模型&#xff08;LLM&#xff09;集成到…

作者头像 李华
网站建设 2026/8/25 7:40:28

TAFAS:面向非平稳时间序列的测试时自适应预测

论文标题&#xff1a;Battling the Non-stationarity in Time Series Forecasting via Test-time Adaptation 论文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/33965 非平稳序列 01 非平稳时间序列的定义 这篇文章主要解决非平稳时间序列建模的问题…

作者头像 李华