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);
        }
    }
    
  • 相关阅读:
    JS实现表格隔行换色,鼠标经过换色,单击换色,再单击还原等功能
    URL带有其他参数时,如何使用PHP的CI框架分页类?
    linux SVN web 同步
    php播放器代码
    php 获取IP 根据IP 获取城市信息 判断是否手机登陆
    微信公众平台获取微信用户信息
    appcan 本地真机调试
    对于探索搜索网站路上的一些迷茫
    成为全栈工程师真的好吗?
    ServletContext与ServletConfig
  • 原文地址:https://www.cnblogs.com/summerday152/p/13878077.html
Copyright © 2011-2022 走看看