package org.jeecg.config;
|
|
import com.baomidou.mybatisplus.core.parser.ISqlParser;
|
import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
|
import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
|
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
|
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
|
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.LongValue;
|
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
|
import net.sf.jsqlparser.expression.operators.relational.InExpression;
|
import net.sf.jsqlparser.schema.Column;
|
import org.apache.ibatis.mapping.MappedStatement;
|
import org.apache.ibatis.reflection.MetaObject;
|
import org.jeecg.config.mybatis.JeecgTenantParser;
|
import org.jeecg.modules.system.util.TenantContext;
|
import org.mybatis.spring.annotation.MapperScan;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 单数据源配置(jeecg.datasource.open = false时生效)
|
* @Author zhoujf
|
*
|
*/
|
@Configuration
|
@MapperScan(value={"org.jeecg.modules.**.mapper*"})
|
public class MybatisPlusConfig {
|
|
/**
|
* tenant_id 字段名
|
*/
|
public static final String tenant_field = "tenant_id";
|
|
/**
|
* 有哪些表需要做多租户 这些表需要添加一个字段 ,字段名和tenant_field对应的值一样
|
*/
|
private static final List<String> tenantTable = new ArrayList<String>();
|
static {
|
tenantTable.add("jee_bug_danbiao");
|
}
|
|
/**
|
* 多租户属于 SQL 解析部分,依赖 MP 分页插件
|
*/
|
@Bean
|
public PaginationInterceptor paginationInterceptor() {
|
PaginationInterceptor paginationInterceptor = new PaginationInterceptor().setLimit(-1);
|
/*
|
* 【测试多租户】 SQL 解析处理拦截器<br>
|
* 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
|
*/
|
List<ISqlParser> sqlParserList = new ArrayList<>();
|
TenantSqlParser tenantSqlParser = new JeecgTenantParser();
|
tenantSqlParser.setTenantHandler(new TenantHandler() {
|
|
@Override
|
public Expression getTenantId(boolean select) {
|
String tenant_id = TenantContext.getTenant();
|
return new LongValue(tenant_id);
|
}
|
@Override
|
public String getTenantIdColumn() {
|
return tenant_field;
|
}
|
|
@Override
|
public boolean doTableFilter(String tableName) {
|
//true则不加租户条件查询 false则加
|
// return excludeTable.contains(tableName);
|
if(tenantTable.contains(tableName)){
|
return false;
|
}
|
return true;
|
}
|
|
private Expression in(String ids){
|
final InExpression inExpression = new InExpression();
|
inExpression.setLeftExpression(new Column(getTenantIdColumn()));
|
final ExpressionList itemsList = new ExpressionList();
|
final List<Expression> inValues = new ArrayList<>(2);
|
for(String id:ids.split(",")){
|
inValues.add(new LongValue(id));
|
}
|
itemsList.setExpressions(inValues);
|
inExpression.setRightItemsList(itemsList);
|
return inExpression;
|
}
|
|
});
|
|
sqlParserList.add(tenantSqlParser);
|
paginationInterceptor.setSqlParserList(sqlParserList);
|
paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
|
@Override
|
public boolean doFilter(MetaObject metaObject) {
|
MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
|
// 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
|
if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
|
return true;
|
}
|
return false;
|
}
|
});
|
return paginationInterceptor;
|
}
|
// /**
|
// * mybatis-plus SQL执行效率插件【生产环境可以关闭】
|
// */
|
// @Bean
|
// public PerformanceInterceptor performanceInterceptor() {
|
// return new PerformanceInterceptor();
|
// }
|
|
}
|