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<br>
|
*
|
* @Description: 多租户配置<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/4 16:05 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@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())
|
);
|
};
|
}
|
}
|