zoukankan      html  css  js  c++  java
  • Mybatis Plus 多租户

    一、代码实现

    1、添加拦截器

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        ArrayList<ISqlParser> sqlParserList = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new TenantSqlParser();
        tenantSqlParser.setTenantHandler(new TenantHandler() {
            @Override
            public String getTenantIdColumn() {
                //获取租户字段名
                return "manager_id";
            }
    
            @Override
            public Expression getTenantId() {
                //获取租户 ID 值表达式,只支持单个 ID 值,一般来自session/token等
                return new LongValue(1087982257332887553L);
            }
    
            @Override
            public boolean doTableFilter(String tableName) {
                //根据表名判断是否忽略拼接多租户条件
                //默认都要进行解析并拼接多租户条件
                //true:表示忽略,false:需要解析并拼接多租户条件
                return false;
            }
        });
        sqlParserList.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParserList);
    
        return paginationInterceptor;
    }

    2、测试

    @Test
    public void select(){
        List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);
    }

    可以看到测试虽然是查询全部,但是添加了条件:manager_id = 1087982257332887553

    二、特点SQL过滤

    1、方式一

    这种方式可以过滤MP自带的方法,也可以过滤我们自己定义在xml里的方法

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        ArrayList<ISqlParser> sqlParserList = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new TenantSqlParser();
        tenantSqlParser.setTenantHandler(new TenantHandler() {
            @Override
            public String getTenantIdColumn() {
                //获取租户字段名
                return "manager_id";
            }
    
            @Override
            public Expression getTenantId() {
                //获取租户 ID 值表达式,只支持单个 ID 值,一般来自session/token等
                return new LongValue(1087982257332887553L);
            }
    
            @Override
            public boolean doTableFilter(String tableName) {
                //根据表名判断是否忽略拼接多租户条件
                //默认都要进行解析并拼接多租户条件
                //true:表示忽略,false:需要解析并拼接多租户条件
                return false;
            }
        });
        sqlParserList.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParserList);
    
        //设置哪些SQL不拼接多租户条件
        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            //true:表示忽略,false:需要解析并拼接多租户条件
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
                if ("com.mp.dao.UserMapper.selectList".equals(ms.getId())) {
                    return true;
                }
                return false;
            }
        });
    
        return paginationInterceptor;
    }

    2、方式二

    使用@SqlParser(filter = true)来过滤

    public interface UserMapper extends BaseMapper<User> {
        @SqlParser(filter = true)
        List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
    }

    注意:低版本MP需要在配置文件中设置:mybatis-plus.global-config.sql-parser-cache=true

  • 相关阅读:
    html5——拖拽
    html5——多媒体(四)
    html5——多媒体(三)
    html5——多媒体(二)
    html5——全屏滚动
    html5——web字体
    html5——伸缩比例案例(携程)
    html5——伸缩比例
    html5——伸缩布局
    html5——多列布局
  • 原文地址:https://www.cnblogs.com/jwen1994/p/14539333.html
Copyright © 2011-2022 走看看