forked from kidgrow-microservices-platform

zhaoxiaohao
2020-05-22 f21c78ae0e3c410c6ba5be77277b5b491aca3af1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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);
 
            //动态表名解析器
            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);
            }
            sqlParserList.add(tenantSqlParser);
//            paginationInterceptor.setSqlParserList(CollUtil.toList(tenantSqlParser));
            paginationInterceptor.setSqlParserList(sqlParserList);
            paginationInterceptor.setSqlParserFilter(sqlParserFilter);
        }
 
 
 
        // 开启 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();
//    }
}