使用 MyBatis-Plus 实现数据库的多租户管理

莱莱  论坛元老 | 2025-3-12 23:34:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3021

在现代 SaaS(软件即服务)应用中,多租户架构是一种常见的设计模式。它允许多个租户共享同一个应用实例,同时确保每个租户的数据相互隔离。MyBatis-Plus 提供了强大的多租户支持,可以或许帮助开发者轻松实现多租户管理。本文将详细介绍多租户的实现原理、在 MyBatis-Plus 中如何设置多租户、SQL 拦截与动态参数注入,以及多租户体系中的权限与数据隔离。

1. 多租户的实现原理

1.1 什么是多租户?

多租户是指在一个应用实例中,多个租户(客户或构造)共享相同的硬件和软件资源,但每个租户的数据和设置是相互隔离的。多租户架构的核心目标是:


  • 资源共享:降低硬件和运维本钱。
  • 数据隔离:确保每个租户的数据安全性和隐私性。
1.2 多租户的实现方式

多租户通常有以下三种实现方式:
(1)独立数据库(Database per Tenant)



  • 每个租户拥有独立的数据库。
  • 优点:数据隔离性好,性能高。
  • 缺点:本钱高,维护复杂。
(2)共享数据库,独立 Schema(Schema per Tenant)



  • 全部租户共享同一个数据库,但每个租户拥有独立的 Schema。
  • 优点:数据隔离性较好,本钱较低。
  • 缺点:Schema 管理复杂。
(3)共享数据库,共享 Schema(Shared Database, Shared Schema)



  • 全部租户共享同一个数据库和 Schema,通过租户 ID 区分数据。
  • 优点:本钱最低,维护简单。
  • 缺点:数据隔离性较差,需要额外的逻辑确保数据安全。
1.3 多租户的核心技能



  • 租户标识(Tenant ID):每个租户有一个唯一的标识,用于区分数据。
  • SQL 拦截与动态参数注入:在 SQL 实验时,自动添加租户 ID 作为查询条件。
  • 数据隔离与权限控制:确保每个租户只能访问自己的数据。

2. 在 MyBatis-Plus 中如何设置多租户

对于**独立数据库(Database Per Tenant)**的多租户实现方式,Mybatis-Plus 本身并没有直接提供开箱即用的支持;通常独立数据库的多租户实现需要动态切换数据源(DataSource)。而 Mybatis-Plus 更专注于 SQL 层面的多租户支持(如共享数据库的多租户过滤)。
2.1 引入依靠

确保项目中已经引入 MyBatis-Plus 的依靠:
  1. <dependency>
  2.     <groupId>com.baomidou</groupId>
  3.     <artifactId>mybatis-plus-boot-starter</artifactId>
  4.     <version>最新版本</version>
  5. </dependency>
复制代码
2.2 设置多租户拦截器

在 MyBatis-Plus 中,通过 TenantLineInnerInterceptor 实现多租户的 SQL 拦截与动态参数注入。
设置示例:

  1. @Configuration
  2. public class MybatisPlusConfig {
  3.     @Bean
  4.     public MybatisPlusInterceptor mybatisPlusInterceptor() {
  5.         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  6.         // 添加多租户拦截器
  7.         TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
  8.         tenantInterceptor.setTenantLineHandler(new TenantLineHandler() {
  9.             @Override
  10.             public Expression getTenantId() {
  11.                 // 返回当前租户 ID
  12.                 return new LongValue(1L); // 假设当前租户 ID 为 1
  13.             }
  14.             @Override
  15.             public String getTenantIdColumn() {
  16.                 // 返回租户 ID 的列名
  17.                 return "tenant_id";
  18.             }
  19.             @Override
  20.             public boolean ignoreTable(String tableName) {
  21.                 // 忽略不需要多租户过滤的表
  22.                 return "sys_config".equals(tableName); // 例如系统配置表不需要过滤
  23.             }
  24.         });
  25.         interceptor.addInnerInterceptor(tenantInterceptor);
  26.         return interceptor;
  27.     }
  28. }
复制代码
2.3 实体类设置

在实体类中添加租户 ID 字段,并使用 @TableField 注解标记:
  1. @Data
  2. public class User {
  3.     private Long id;
  4.     private String username;
  5.     @TableField("tenant_id")
  6.     private Long tenantId; // 租户 ID
  7. }
复制代码

3. 多租户的 SQL 拦截与动态参数注入

3.1 SQL 拦截原理

MyBatis-Plus 的多租户拦截器会在 SQL 实验时,自动在查询条件中添加租户 ID。例如:


  • 原始 SQL:
    1. SELECT * FROM user WHERE username = 'admin';
    复制代码
  • 拦截后的 SQL:
    1. SELECT * FROM user WHERE username = 'admin' AND tenant_id = 1;
    复制代码
3.2 动态参数注入

通过 TenantLineHandler,可以动态注入当前租户 ID。例如:
  1. @Override
  2. public Expression getTenantId() {
  3.     // 从当前线程或上下文中获取租户 ID
  4.     return new LongValue(TenantContext.getCurrentTenantId());
  5. }
复制代码

4. 多租户体系中的权限与数据隔离

4.1 数据隔离

在多租户体系中,数据隔离是核心需求。通过 MyBatis-Plus 的多租户拦截器,可以确保每个租户只能访问自己的数据。
示例:



  • 租户 A(ID=1)只能访问 tenant_id = 1 的数据。
  • 租户 B(ID=2)只能访问 tenant_id = 2 的数据。
4.2 权限控制

在多租户体系中,权限控制需要联合租户 ID 和用户角色。例如:


  • 超等管理员:可以访问全部租户的数据。
  • 租户管理员:只能访问自己租户的数据。
  • 平凡用户:只能访问自己创建的数据。
实现方式:



  • 在查询时,动态添加租户 ID 和用户权限条件。
  • 使用 Spring Security 或自界说权限框架实现细粒度的权限控制。
示例代码:

  1. public List<User> getUsersByRole(Long tenantId, String role) {
  2.     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  3.     queryWrapper.eq("tenant_id", tenantId)
  4.                 .eq("role", role);
  5.     return userMapper.selectList(queryWrapper);
  6. }
复制代码

5. 总结

通过 MyBatis-Plus 的多租户支持,可以轻松实现多租户管理。以下是关键点总结:

  • 多租户的实现原理

    • 独立数据库、独立 Schema、共享数据库三种方式。
    • 核心是通过租户 ID 实现数据隔离。

  • MyBatis-Plus 的多租户设置

    • 使用 TenantLineInnerInterceptor 实现 SQL 拦截与动态参数注入。
    • 在实体类中标记租户 ID 字段。

  • SQL 拦截与动态参数注入

    • 自动在查询条件中添加租户 ID。
    • 动态注入当前租户 ID。

  • 权限与数据隔离

    • 联合租户 ID 和用户角色实现细粒度的权限控制。
    • 确保每个租户只能访问自己的数据。

通过公道的设计和设置,MyBatis-Plus 可以帮助开发者构建高效、安全的多租户体系。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表