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