多租户 SQL 解析器

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

👉 mybatisplus-spring-boot

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