【Mybatis-Plus进阶学习(六)】多租户SQL解析器

多租户是一种结构,就是让多个用户(一般是企业)共同使用同一个系统,但是做到数据隔离,互不干涉。

独立数据库:隔离级别最高,有助于数据库的扩展,满足客户的不同需求,出现问题恢复比较方便。但是创建和维护成本也增加了。
共享数据库,独立Schema:同一个数据库,但是不同的用户拥有自己的schema或者user,为安全性较高的用户进行逻辑隔离,可以供更多的租户使用。但是出现问题恢复较难,因为会影响到其他租户的数据。
共享数据库,共享Schema,共享数据库表:在表中添加租户ID,共享程度最高,隔离级别最低。维护成本最低,支持用户最多,安全性能较低,数据库备份还原成本高。

多租户的简单使用

依赖于分页插件,这里演示第三种多租户方案,以Manage_Id作为租户Id。

首先需要添加分页插件,具体如下:

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        ArrayList<ISqlParser> sqlParsers = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new TenantSqlParser();

        tenantSqlParser.setTenantHandler(new TenantHandler() {
            @Override
            public Expression getTenantId() {
                //这里我们为了演示,直接写死。
                return new LongValue(1088248166370832385L);
            }

            @Override
            public String getTenantIdColumn() {
                //表中的字段名,不是属性名
                return "manager_id";
            }

            @Override
            public boolean doTableFilter(String tableName) {
                //加不加租户信息,false就是加
                if ("role".equals(tableName)) {
                    //role表不加,虽然这个demo里面没有role,但是大家理解就行
                    return true;
                }
                return false;
            }
        });
        //加载
        sqlParsers.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParsers);
        return paginationInterceptor;
    }

除了查询,增加修改和删除都是一样的。

特定SQL过滤

之前多租户的模式最低也是表级别的,而SQL过滤就是语句级别的了。

实现这SQL过滤有两个方法:

  1. 在分页插件中使用setSqlParserFilter,进行crud的过滤,让这些curd不增加租户标识。
//过滤方法
        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement mappedStatement = SqlParserHelper.getMappedStatement(metaObject);
                if ("com.fang.dao.UserMapper.selectById".equals(mappedStatement.getId())) {
                    return true;
                }
                return false;
            }
        });

返回ture,意思是将这个方法过滤掉,也就是不加租户Id。false反之。

  1. 使用注解
    @SqlParser(filter = true)
    @Select("select * from user ${ew.customSqlSegment}")
    List<User> mySelectList(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

如果你是3.1.1之前的版本,还需要再application.properties中添加配置mybatis-plus.global-config.sql-parser-cache=true

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值