zoukankan      html  css  js  c++  java
  • MybatisPlus的多租户插件使用!

    本文代码样例均已上传至Gitee:https://gitee.com/tqbx/springboot-samples-learn/tree/master/spring-boot-mybatis-plus-primer

    核心插件: TenantLineInnerInterceptor

    核心处理器:TenantLineHandler

    public interface TenantLineHandler {
    
        /**
         * 获取租户 ID 值表达式,只支持单个 ID 值
         * <p>
         *
         * @return 租户 ID 值表达式
         */
        Expression getTenantId();
    
        /**
         * 获取租户字段名
         * <p>
         * 默认字段名叫: tenant_id
         *
         * @return 租户字段名
         */
        default String getTenantIdColumn() {
            return "tenant_id";
        }
    
        /**
         * 根据表名判断是否忽略拼接多租户条件
         * <p>
         * 默认都要进行解析并拼接多租户条件
         *
         * @param tableName 表名
         * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
         */
        default boolean ignoreTable(String tableName) {
            return false;
        }
    }
    

    说明:

    多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!!
    启用多租户后所有执行的method的sql都会进行处理.
    自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
        // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
        //        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(
            new TenantLineHandler() {
                // manager_id = 1088248166370832385
    
                // 获取租户 ID 值表达式,只支持单个 ID 值
                @Override
                public Expression getTenantId() {
                    return new LongValue(1088248166370832385L);
                }
                // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件,
                // 这里设置 role表不需要该条件
                @Override
                public boolean ignoreTable(String tableName) {
                    if ("role".equals(tableName)) {
                        return true;
                    }
                    return false;
                }
    
                @Override
                public String getTenantIdColumn() {
                    return "manager_id";
                }
            }));
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
    

    测试

    @RunWith(SpringRunner.class)
    @SpringBootTest
    class TenantTest {
    
        @Resource
        UserMapper userMapper;
    
        @Test
        void select(){
            // manager_id = 1088248166370832385
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
        }
    }
    
  • 相关阅读:
    Contest
    【HDU2224】The shortest path(双调欧几里得dp)
    UVa400.Unix ls
    一些脚本
    省赛总结
    一些事
    一些笔记
    CSU 1526: Beam me out!
    以后可能用到的命令
    Codeforces Round #297 (Div. 2)
  • 原文地址:https://www.cnblogs.com/summerday152/p/13878077.html
Copyright © 2011-2022 走看看