Mybatis Plus 多租戶


一、代碼實現

1、添加攔截器

@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    ArrayList<ISqlParser> sqlParserList = new ArrayList<>();
    TenantSqlParser tenantSqlParser = new TenantSqlParser();
    tenantSqlParser.setTenantHandler(new TenantHandler() {
        @Override
        public String getTenantIdColumn() {
            //獲取租戶字段名
            return "manager_id";
        }

        @Override
        public Expression getTenantId() {
            //獲取租戶 ID 值表達式,只支持單個 ID 值,一般來自session/token等
            return new LongValue(1087982257332887553L);
        }

        @Override
        public boolean doTableFilter(String tableName) {
            //根據表名判斷是否忽略拼接多租戶條件
            //默認都要進行解析並拼接多租戶條件
            //true:表示忽略,false:需要解析並拼接多租戶條件
            return false;
        }
    });
    sqlParserList.add(tenantSqlParser);
    paginationInterceptor.setSqlParserList(sqlParserList);

    return paginationInterceptor;
}

2、測試

@Test
public void select(){
    List<User> list = userMapper.selectList(null);
    list.forEach(System.out::println);
}

可以看到測試雖然是查詢全部,但是添加了條件:manager_id = 1087982257332887553

二、特點SQL過濾

1、方式一

這種方式可以過濾MP自帶的方法,也可以過濾我們自己定義在xml里的方法

@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    ArrayList<ISqlParser> sqlParserList = new ArrayList<>();
    TenantSqlParser tenantSqlParser = new TenantSqlParser();
    tenantSqlParser.setTenantHandler(new TenantHandler() {
        @Override
        public String getTenantIdColumn() {
            //獲取租戶字段名
            return "manager_id";
        }

        @Override
        public Expression getTenantId() {
            //獲取租戶 ID 值表達式,只支持單個 ID 值,一般來自session/token等
            return new LongValue(1087982257332887553L);
        }

        @Override
        public boolean doTableFilter(String tableName) {
            //根據表名判斷是否忽略拼接多租戶條件
            //默認都要進行解析並拼接多租戶條件
            //true:表示忽略,false:需要解析並拼接多租戶條件
            return false;
        }
    });
    sqlParserList.add(tenantSqlParser);
    paginationInterceptor.setSqlParserList(sqlParserList);

    //設置哪些SQL不拼接多租戶條件
    paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
        //true:表示忽略,false:需要解析並拼接多租戶條件
        @Override
        public boolean doFilter(MetaObject metaObject) {
            MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
            if ("com.mp.dao.UserMapper.selectList".equals(ms.getId())) {
                return true;
            }
            return false;
        }
    });

    return paginationInterceptor;
}

2、方式二

使用@SqlParser(filter = true)來過濾

public interface UserMapper extends BaseMapper<User> {
    @SqlParser(filter = true)
    List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
}

注意:低版本MP需要在配置文件中設置:mybatis-plus.global-config.sql-parser-cache=true


免責聲明!

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



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