package com.kidgrow.db.config; import com.baomidou.mybatisplus.core.parser.ISqlParser; import com.baomidou.mybatisplus.core.parser.ISqlParserFilter; import com.baomidou.mybatisplus.extension.parsers.DynamicTableNameParser; import com.baomidou.mybatisplus.extension.parsers.ITableNameHandler; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; import com.kidgrow.common.context.DynamicTableContextHolder; import com.kidgrow.common.properties.TenantProperties; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: Mybatis-plus 配置
* @Project:
* @CreateDate: Created in 2020/2/4 16:05
* @Author: liuke */ @Slf4j @Import(DateMetaObjectHandler.class) public class DefaultMybatisPlusConfig { @Autowired private TenantHandler tenantHandler; @Autowired private ISqlParserFilter sqlParserFilter; @Autowired private TenantProperties tenantProperties; /** * 分页插件,自动识别数据库类型 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); boolean enableTenant = tenantProperties.getEnable(); ArrayList sqlParserList = new ArrayList(); // log.info("多租户状态:"+enableTenant); //是否开启多租户隔离 if (enableTenant) { TenantSqlParser tenantSqlParser = new TenantSqlParser() .setTenantHandler(tenantHandler); sqlParserList.add(tenantSqlParser); //动态表名解析器 DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser(); Map tableNameHanderMap = new HashMap<>(); //通过配置文件获取需要动态解析的表名 List dynamicTables = tenantProperties.getDynamicTables(); if(dynamicTables.size()>0){ dynamicTables.forEach(item->{ tableNameHanderMap.put(item, new ITableNameHandler() { @Override public String dynamicTableName(MetaObject metaObject, String sql, String tableName) { return DynamicTableContextHolder.getDynamicTable(); } }); }); dynamicTableNameParser.setTableNameHandlerMap(tableNameHanderMap); sqlParserList.add(dynamicTableNameParser); } // paginationInterceptor.setSqlParserList(CollUtil.toList(tenantSqlParser)); paginationInterceptor.setSqlParserList(sqlParserList); paginationInterceptor.setSqlParserFilter(sqlParserFilter); } else { //动态表名解析器 DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser(); Map tableNameHanderMap = new HashMap<>(); //通过配置文件获取需要动态解析的表名 List dynamicTables = tenantProperties.getDynamicTables(); if(dynamicTables.size()>0){ dynamicTables.forEach(item->{ tableNameHanderMap.put(item, new ITableNameHandler() { @Override public String dynamicTableName(MetaObject metaObject, String sql, String tableName) { return DynamicTableContextHolder.getDynamicTable(); } }); }); dynamicTableNameParser.setTableNameHandlerMap(tableNameHanderMap); sqlParserList.add(dynamicTableNameParser); paginationInterceptor.setSqlParserList(sqlParserList); paginationInterceptor.setSqlParserFilter(sqlParserFilter); } // paginationInterceptor.setSqlParserList(CollUtil.toList(tenantSqlParser)); } // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } /** * 乐观锁插件 * @return */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } // Mybatis-plus 3.2.0 以上版本移除推荐使用第三方扩展 执行SQL分析打印 功能 // https://mp.baomidou.com/guide/performance-analysis-plugin.html /** * 打印 sql,性能分析拦截器,不建议生产使用 * 设置 dev test 环境开启 */ // @Bean // @Profile({"dev","test"}) // public PerformanceInterceptor performanceInterceptor() { // return new PerformanceInterceptor(); // } }