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