dengzedong
2024-09-13 19ef4ca4f7252c34fe2e2a03b8868fc997ddd86f
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.tenant.core.db;
H 2
3 import cn.hutool.core.collection.CollUtil;
4 import com.iailab.framework.tenant.config.TenantProperties;
5 import com.iailab.framework.tenant.core.context.TenantContextHolder;
6 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
7 import net.sf.jsqlparser.expression.Expression;
8 import net.sf.jsqlparser.expression.LongValue;
9
10 import java.util.HashSet;
11 import java.util.Set;
12
13 /**
14  * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能
15  *
16  * @author iailab
17  */
18 public class TenantDatabaseInterceptor implements TenantLineHandler {
19
20     private final Set<String> ignoreTables = new HashSet<>();
21
22     public TenantDatabaseInterceptor(TenantProperties properties) {
23         // 不同 DB 下,大小写的习惯不同,所以需要都添加进去
24         properties.getIgnoreTables().forEach(table -> {
25             ignoreTables.add(table.toLowerCase());
26             ignoreTables.add(table.toUpperCase());
27         });
28         // 在 OracleKeyGenerator 中,生成主键时,会查询这个表,查询这个表后,会自动拼接 TENANT_ID 导致报错
29         ignoreTables.add("DUAL");
30     }
31
32     @Override
33     public Expression getTenantId() {
34         return new LongValue(TenantContextHolder.getRequiredTenantId());
35     }
36
37     @Override
38     public boolean ignoreTable(String tableName) {
39         return TenantContextHolder.isIgnore() // 情况一,全局忽略多租户
40             || CollUtil.contains(ignoreTables, tableName); // 情况二,忽略多租户的表
41     }
42
43 }