MybatisPlus的多租户插件使用!

前端之家收集整理的这篇文章主要介绍了MybatisPlus的多租户插件使用!前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文代码样例均已上传至Gitee:https://gitee.com/tqbx/springboot-samples-learn/tree/master/spring-boot-mybatis-plus-primer

核心插件: TenantLineInnerInterceptor

核心处理器:TenantLineHandler

  1. public interface TenantLineHandler {
  2. /**
  3. * 获取租户 ID 值表达式,只支持单个 ID 值
  4. * <p>
  5. *
  6. * @return 租户 ID 值表达式
  7. */
  8. Expression getTenantId();
  9. /**
  10. * 获取租户字段名
  11. * <p>
  12. * 默认字段名叫: tenant_id
  13. *
  14. * @return 租户字段名
  15. */
  16. default String getTenantIdColumn() {
  17. return "tenant_id";
  18. }
  19. /**
  20. * 根据表名判断是否忽略拼接多租户条件
  21. * <p>
  22. * 默认都要进行解析并拼接多租户条件
  23. *
  24. * @param tableName 表名
  25. * @return 是否忽略,true:表示忽略,false:需要解析并拼接多租户条件
  26. */
  27. default boolean ignoreTable(String tableName) {
  28. return false;
  29. }
  30. }

说明:

多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!!
启用多租户后所有执行的method的sql都会进行处理.
自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)

  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4. // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
  5. // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
  6. // interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  7. interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(
  8. new TenantLineHandler() {
  9. // manager_id = 1088248166370832385
  10. // 获取租户 ID 值表达式,只支持单个 ID 值
  11. @Override
  12. public Expression getTenantId() {
  13. return new LongValue(1088248166370832385L);
  14. }
  15. // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件,// 这里设置 role表不需要该条件
  16. @Override
  17. public boolean ignoreTable(String tableName) {
  18. if ("role".equals(tableName)) {
  19. return true;
  20. }
  21. return false;
  22. }
  23. @Override
  24. public String getTenantIdColumn() {
  25. return "manager_id";
  26. }
  27. }));
  28. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MysqL));
  29. return interceptor;
  30. }
  31. @Bean
  32. public ConfigurationCustomizer configurationCustomizer() {
  33. return configuration -> configuration.setUseDeprecatedExecutor(false);
  34. }

测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. class TenantTest {
  4. @Resource
  5. UserMapper userMapper;
  6. @Test
  7. void select(){
  8. // manager_id = 1088248166370832385
  9. List<User> users = userMapper.selectList(null);
  10. users.forEach(System.out::println);
  11. }
  12. }

猜你在找的Mybatis相关文章