在项目中很多时候会遇见多租户的问题,在写SQL时每次拼装租户条件会很麻烦,下面分享mybatis-plus自动拼装租户条件

EnableTransactionManagement(proxyTargetClass = true)
@Configuration
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfig {
    /**
     * 默认租户字段
     */
    private static final String TENANT_FIELD_NAME = "t_id";
    /**
     * 租户1
     */
    private static final String ENTERPRISE_FIELD_NAME = "e_id";
    /**
     * 租户2 
     */
    private static final String PROVIDER_FIELD_NAME = "p_id";
    /**
     * 哪些表需要做多租户
     */
    private static final List<String> TENANT_TABLES = new ArrayList<>();

    static {
        // 那些表有多租户

        //用户、角色、部门
        TENANT_TABLES.add("sys_user");
        TENANT_TABLES.add("sys_dept");
    }

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                Long tId = TenantContext.getTenantId();
                if (tId == null) {
                    tId = -1L;
                }
                return new LongValue(tId);
            }

            @Override
            public String getTenantIdColumn() {
                Integer tenantType = TenantContext.getTenantType();
                if (tenantType != null) {
                    if (PlatformEnum.PROVIDER.getCode() == tenantType) {
                        return PROVIDER_FIELD_NAME;
                    } else if (PlatformEnum.ENTERPRISE.getCode() == tenantType) {
                        return ENTERPRISE_FIELD_NAME;
                    } else {
                        return TENANT_FIELD_NAME;
                    }
                } else {
                    return TENANT_FIELD_NAME;
                }
            }

            // 返回 true 表示不走租户逻辑  
需要在SQL上加  @InterceptorIgnore(tenantLine = "true")
            @Override
            public boolean ignoreTable(String tableName) {
                if (TenantContext.getTenantType() == null){
                    return true;
                }
                //服务商和企业公共的
                if (TenantContext.getTenantType() == PlatformEnum.PROVIDER.getCode() || TenantContext.getTenantType() == PlatformEnum.ENTERPRISE.getCode()) {
                    return !TENANT_TABLES.stream().anyMatch(i -> i.equalsIgnoreCase(tableName));
                }
                //服务商需要额外的
                if (TenantContext.getTenantType() == PlatformEnum.PROVIDER.getCode()) {
                    return !"sys_enterprise".equalsIgnoreCase(tableName);
                }
                return true;
            }
        }));

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值