【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM