• 【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

  • 相关阅读:
    java实现第九届蓝桥杯最大乘积
    java实现第九届蓝桥杯最大乘积
    Anaconda入门使用指南
    Java安全——密钥那些事
    关于keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
    @Transactional事务几点注意
    三种方式都是通过某种公开的算法将原始信息进行编码 /加密
    信息摘要算法 MessageDigestUtil
    Java使用RSA加密解密签名及校验
    java util
  • 原文地址:https://www.cnblogs.com/zllk/p/14239869.html
Copyright © 2020-2023  润新知