mybatis plus 多租户 SQL 解析器

github地址https://github.com/heng1234/mybatis_plus

基于https://blog.csdn.net/qq_39313596/article/details/100901642文章

 

使用场景  一个系统多个不同用户查询不同用户的数据

 

manager_id用于作为多租户id查询

MybatisPlusConfig加入多租户解析器
@Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        /*
         * 【测试多租户】 SQL 解析处理拦截器<br>
         * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
         */
        List<ISqlParser> sqlParserList = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new TenantSqlParser();
        tenantSqlParser.setTenantHandler(new TenantHandler() {
           /* @Override
            public Expression getTenantId(boolean where) {
                // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用
                // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程
                return new LongValue(1L);
            }*/

            @Override
            public Expression getTenantId() {
                return new LongValue(5L);//传入的值一般都是配置文件 静态变量或者session中取出
            }

            @Override
            public String getTenantIdColumn() {
                return "manager_id";//多租户字段
            }

            @Override
            public boolean doTableFilter(String tableName) {
                // 这里可以判断是否过滤表
            /*
            if ("user".equals(tableName)) {
                return true;
            }*/
                return false;
            }
        });
        sqlParserList.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParserList);
       /* paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
                // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
                if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
                    return true;
                }
                return false;
            }
        });*/
        return  paginationInterceptor;
    }

 测试: 会在sql的where中加入一个manager_id = xxx

/**
     * 根据id查询
     * 多租户测试
     *  Consume Time:13 ms 2019-09-17 22:53:39
     *  Execute SQL:SELECT id, name, age, email, manager_id, created_time, update_time, version FROM User WHERE User.manager_id = 5 AND id = 5 AND deleted = 0
     */
    @Test
    public void setectUserById() {
      User user = userMapper.selectById(5);
        System.out.println(user.toString());
    }

下面是特定sql过滤 过滤特定的方法 也可以在userMapper需要排除的方法上加入注解SqlParser(filter=true) 排除 SQL 解析

配置解析器加入

 paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
                // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
                //你要过滤的userMapper里的方法
                if ("com.hlvy.mybatis_plus.mapper.UserMapper.selectById".equals(ms.getId())) {
                    return true;
                }
                return false;
            }
        });

 

  • 相关 SQL 解析如多租户可通过 @SqlParser(filter=true) 排除 SQL 解析,注意!!
  • 全局配置 sqlParserCache 设置为 true 才生效。(3.1.1开始不再需要这一步)
# 开启 SQL 解析缓存注解生效
mybatis-plus:
  global-config:
    sql-parser-cache: true
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值