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<br>
|
*
|
* @Description: Mybatis-plus 配置<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/4 16:05 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@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<ISqlParser> sqlParserList = new ArrayList<ISqlParser>();
|
// log.info("多租户状态:"+enableTenant);
|
//是否开启多租户隔离
|
if (enableTenant) {
|
TenantSqlParser tenantSqlParser = new TenantSqlParser()
|
.setTenantHandler(tenantHandler);
|
sqlParserList.add(tenantSqlParser);
|
//动态表名解析器
|
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
|
Map<String, ITableNameHandler> tableNameHanderMap = new HashMap<>();
|
|
//通过配置文件获取需要动态解析的表名
|
List<String> 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<String, ITableNameHandler> tableNameHanderMap = new HashMap<>();
|
|
//通过配置文件获取需要动态解析的表名
|
List<String> 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();
|
// }
|
}
|