forked from kidgrow-microservices-platform

luliqiang
2020-07-10 cb49a28e3ea5cfac3910f6c237f40bcebd962397
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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();
//    }
}