Skip to content

多租户

说明

多租户就是类似多个子系统;多租户应该是数据绝对隔离的
多租户是围绕实体进行自动设置租户ID,通常在 from(实体类),join(实体类),delete(实体类),update(实体类)

示例

实体类

java
@Data
@Table
public class SysUser {

    @TableId
    private Integer id;

    private String userName;

    private String password;
    
    private Integer roleId;

    private LocalDateTime createTime;

    @TenantId
    private Integer tenantId;
}

Mapper

继承 MybatisMapper 即可

java
public interface SysUserMapper extends MybatisMapper<SysUser> {

}

设置租户ID

java
TenantContext.registerTenantGetter(() -> {
    return 2;
});

如果想临时关闭

java
TenantContext.registerTenantGetter(() -> {
     if(临时关闭){
         //返回null 即可
        return null;    
     }
     return 2;
});

如何使用

java
@Service
public class Test{

    @Autowired
    private SysUserMapper sysUserMapper;

    public void demo() {
        SysUser sysUser=new SysUser();
        sysUserMapper.save(sysUser);
    }
}

save时 tenantId 字段会自动填充,update、delete自动会增加租户ID条件

前往@TenantId 查看

如何配置租户ID

在项目启动时执行

TenantContext.registerTenantGetter(() -> {
    // 这里假设 租户ID是2
    return 2;
});

如何支持多个租户ID

多个租户ID 只支持查询类的

TenantContext.registerTenantGetter(() -> {
    return new TenantId(1, 2, 3);
});

如何实现自己的动态ID(前面2个都是静态的租户ID)

需要自己结合 ThreadLocal 技术 或者 已经有获取方法

创建 租户ID存取类

public class TenantTLUtil {
    
    private static final ThreadLocal<Serializable> TL=new ThreadLocal<>();
    
    public static void set(Serializable tenantId){
        TL.set(tenantId);
    }
    
    public static Serializable get(){
        return TL.get();
    }
    
    public static void clear(){
        TL.remove();
    }
}

动态存放租户ID

拦截器 过滤器 AOP 等等 都可以

TenantTLUtil.set(1);
或者
TenantTLUtil.set(new TenantId(1, 2, 3));

记得 需要自己调 TenantTLUtil.clear();

启动注入配置类

@Configuration
public class MyXbatisConfig {

    @PostConstruct
    public void init() {
       TenantContext.registerTenantGetter(() -> {
            return TenantTLUtil.get();
       });  
    }

}

这样就可以了