Mybatis Plus多租户插件

Mybatis Plus多租户插件

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);