package com.kidgrow.db.config; import com.baomidou.mybatisplus.core.parser.ISqlParserFilter; import com.baomidou.mybatisplus.core.parser.SqlParserHelper; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler; import com.kidgrow.common.properties.TenantProperties; import com.kidgrow.common.context.TenantContextHolder; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.NullValue; import net.sf.jsqlparser.expression.StringValue; import org.apache.ibatis.mapping.MappedStatement; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: 多租户配置
* @Project:
* @CreateDate: Created in 2020/2/4 16:05
* @Author: liuke */ @Slf4j @EnableConfigurationProperties(TenantProperties.class) public class TenantAutoConfigure { @Autowired private TenantProperties tenantProperties; @Bean public TenantHandler tenantHandler() { return new TenantHandler() { // 获取租户id // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用 // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程 // https://mp.baomidou.com/guide/tenant.html @Override public Expression getTenantId(boolean where) { String tenant = TenantContextHolder.getTenant(); //log.info("租户ID:"+tenant); if (tenant != null) { return new StringValue(TenantContextHolder.getTenant()); } return new NullValue(); } /** * 获取租户列名 */ @Override public String getTenantIdColumn() { // return "tenant_id"; return tenantProperties.getTenantid(); } /** * 过滤不需要根据租户隔离的表, 在线程中租户为空时默认不添加 * @param tableName 表名 */ @Override public boolean doTableFilter(String tableName) { String tenant = TenantContextHolder.getTenant(); return tenantProperties.getIgnoreTables().stream().anyMatch( (e) -> e.equalsIgnoreCase(tableName) ) || tenant==null; } }; } /** * 过滤不需要根据租户隔离的MappedStatement */ @Bean public ISqlParserFilter sqlParserFilter() { return metaObject -> { MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject); return tenantProperties.getIgnoreSqls().stream().anyMatch( (e) -> e.equalsIgnoreCase(ms.getId()) ); }; } }