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 tenantTable = new ArrayList(); static { tenantTable.add("jee_bug_danbiao"); } /** * 多租户属于 SQL 解析部分,依赖 MP 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor().setLimit(-1); /* * 【测试多租户】 SQL 解析处理拦截器
* 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )
*/ List 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 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(); // } }