多租户 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