多租户
说明
多租户就是类似多个子系统;多租户应该是数据绝对隔离的
多租户是围绕实体进行自动设置租户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();
});
}
}
这样就可以了