1.MybatisPlusConfig 添加租户插件
private final TenantLineHandler kmaTenantLineHandler;
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(kmaTenantLineHandler));
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
}
2.多租户处理器
/**
* created with IntelliJ IDEA.
*
* @author: yz
* @date: 2021/11/28
* @time: 9:40 下午
* @description 多租户处理器
*/
@Component
@RequiredArgsConstructor
public class KmaTenantLineHandler implements TenantLineHandler {
private final TenantProperties tenantProperties;
/**
* 获取租户 ID 值表达式,只支持单个 ID 值
* <p>
*
* @return 租户 ID 值表达式
*/
@Override
public Expression getTenantId() {
String tenant = KmaUtil.getTenantId();
if (tenant != null) {
return new StringValue(tenant);
}
return new NullValue();
}
/**
* 获取租户字段名
* <p>
* 默认字段名叫: tenant_id
*
* @return 租户字段名
*/
@Override
public String getTenantIdColumn() {
return tenantProperties.getColumn();
}
/**
* 根据表名判断是否忽略拼接多租户条件
* <p>
* 默认都要进行解析并拼接多租户条件
*
* @param tableName 表名
* @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
*/
@Override
public boolean ignoreTable(String tableName) {
return tenantProperties.getExclusionTable().stream().anyMatch(
(t) -> t.equalsIgnoreCase(tableName)
);
}
}
3.多租户配置
/**
* 白名单配置
*
* @author yz
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "mybatis-plus.tenant")
public class TenantProperties {
/**
* 是否开启租户模式
*/
private Boolean enable;
/**
* 多租户字段名称
*/
private String column;
/**
* 需要排除的多租户的表
*/
private List<String> exclusionTable;
}
4.配置文件
mybatis-plus:
tenant:
# 是否开启租户模式 弃用此功能
enable: true
# 租户字段名称
column: tenant_id
# 需要排除的多租户的表
exclusionTable:
- "kma_sys_role_menu"
- "kma_sys_user_role"
- "kma_sys_user_data_permission"
5.自定义sql使用注解排除租户
@InterceptorIgnore(tenantLine = StringConstant.ONE)
<T> IPage<Role> findRolePage(Page<T> page, @Param("role") Role role);