• 多租户 SQL 解析器

    多租户 SQL 解析器

    • 这里配合 分页拦截器 使用, spring boot 例子配置如下:示例工程:

    ? mybatis-plus-sample-tenant多租户 SQL 解析器 - 图1

    ? mybatisplus-spring-boot多租户 SQL 解析器 - 图2

    1. @Bean
    2. public PaginationInterceptor paginationInterceptor() {
    3. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    4. /*
    5. * 【测试多租户】 SQL 解析处理拦截器<br>
    6. * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
    7. */
    8. List<ISqlParser> sqlParserList = new ArrayList<>();
    9. TenantSqlParser tenantSqlParser = new TenantSqlParser();
    10. tenantSqlParser.setTenantHandler(new TenantHandler() {
    11. @Override
    12. public Expression getTenantId(boolean where) {
    13. // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用
    14. // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程
    15. return new LongValue(1L);
    16. }
    17. @Override
    18. public String getTenantIdColumn() {
    19. return "tenant_id";
    20. }
    21. @Override
    22. public boolean doTableFilter(String tableName) {
    23. // 这里可以判断是否过滤表
    24. /*
    25. if ("user".equals(tableName)) {
    26. return true;
    27. }*/
    28. return false;
    29. }
    30. });
    31. sqlParserList.add(tenantSqlParser);
    32. paginationInterceptor.setSqlParserList(sqlParserList);
    33. paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
    34. @Override
    35. public boolean doFilter(MetaObject metaObject) {
    36. MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
    37. // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
    38. if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
    39. return true;
    40. }
    41. return false;
    42. }
    43. });
    44. return paginationInterceptor;
    45. }
    • 相关 SQL 解析如多租户可通过 @SqlParser(filter=true) 排除 SQL 解析,注意!!全局配置 sqlParserCache 设置为 true 才生效。(3.1.1开始不再需要这一步)
    1. # 开启 SQL 解析缓存注解生效
    2. mybatis-plus:
    3. global-config:
    4. sql-parser-cache: true