文章目录
- 一、概述
- 二、多租户支持整体架构
- 2.1 项目结构
- 2.2 核心组件关系
- 2.3 拦截器链执行顺序
- 三、租户行过滤器(TenantLineInnerInterceptor)详解
- 3.1 工作原理
- 3.2 四类 SQL 语句的差异化处理
- SELECT 语句处理
- INSERT 语句处理
- UPDATE 语句处理
- DELETE 语句处理
- 3.3 表别名与租户列拼接
- 3.4 ExpressionAppendMode:WHERE 条件追加位置
- 3.5 忽略策略:ignoreTable 与 InterceptorIgnore
- 3.6 测试覆盖范围
- 四、动态表名处理(DynamicTableNameHandler)
- 4.1 设计定位
- 4.2 核心组件
- 4.3 SQL 改写流程
- 4.4 动态表名拦截器入口
- 4.5 命名策略建议
- 4.6 已知限制
- 4.7 与分页、租户过滤的协同顺序
- 五、租户隔离策略
- 5.1 表级隔离 vs 行级隔离
- 5.2 与数据权限控制的协同
- 5.3 与缓存机制的交互
- 5.4 监控与审计方案
- 六、租户配置管理与 Spring Boot 集成
- 6.1 Spring Boot 自动装配
- 6.2 完整配置示例
- 6.3 配置验证
- 七、性能考量与优化建议
- 7.1 SQL 解析成本
- 7.2 缓存策略
- 7.3 索引建议
- 7.4 表过滤优化
- 7.5 批量操作
- 八、故障排查指南
- 8.1 隔离失效
- 8.2 缓存污染
- 8.3 多表更新报错
- 8.4 忽略策略误用
- 8.5 解析异常
- 8.6 包裹符号问题
- 8.7 调试建议
- 九、总结
一、概述
在 SaaS 应用中,多租户数据隔离是架构设计的核心命题。MyBatis-Plus 为开发者提供了一套成熟的拦截器链机制,能在 SQL 执行前自动注入租户条件或动态替换表名,从根本上避免人工改写 SQL 带来的遗漏风险。
本文基于 MyBatis-Plus 3.5 中的mybatis-plus-jsqlparser-support、mybatis-plus-extension、spring-boot-starter等模块源码,结合大量单元测试覆盖的边界场景,系统性地拆解多租户支持的完整链路。帮你了解:
- 租户行过滤器如何根据不同 SQL 类型(SELECT / INSERT / UPDATE / DELETE)进行差异化改写
- 动态表名处理器如何利用 JSQLParser 遍历 AST 并替换表名
- 表级与行级隔离策略的选型依据及实现差异
- 分页插件、数据权限插件与租户拦截器的执行顺序与协同原理
- 缓存键扩展、性能优化与常见故障的排查路径
二、多租户支持整体架构
2.1 项目结构
围绕多租户能力,相关实现分布在以下核心模块:
| 模块 | 职责 |
|---|---|
mybat |