mybatis plus 多租户 SQL 解析器

github地址https://github.com/heng1234/mybatis_plus

基于https://blog.csdn.net/qq_39313596/article/details/100901642文章

 

使用场景  一个系统多个不同用户查询不同用户的数据

 

manager_id用于作为多租户id查询

mybatis plus 多租户 SQL 解析器_第1张图片

MybatisPlusConfig加入多租户解析器
@Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        /*
         * 【测试多租户】 SQL 解析处理拦截器
* 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )
*/ List sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { /* @Override public Expression getTenantId(boolean where) { // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用 // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程 return new LongValue(1L); }*/ @Override public Expression getTenantId() { return new LongValue(5L);//传入的值一般都是配置文件 静态变量或者session中取出 } @Override public String getTenantIdColumn() { return "manager_id";//多租户字段 } @Override public boolean doTableFilter(String tableName) { // 这里可以判断是否过滤表 /* if ("user".equals(tableName)) { return true; }*/ return false; } }); sqlParserList.add(tenantSqlParser); paginationInterceptor.setSqlParserList(sqlParserList); /* paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { @Override public boolean doFilter(MetaObject metaObject) { MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject); // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现 if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) { return true; } return false; } });*/ return paginationInterceptor; }

 测试: 会在sql的where中加入一个manager_id = xxx

/**
     * 根据id查询
     * 多租户测试
     *  Consume Time:13 ms 2019-09-17 22:53:39
     *  Execute SQL:SELECT id, name, age, email, manager_id, created_time, update_time, version FROM User WHERE User.manager_id = 5 AND id = 5 AND deleted = 0
     */
    @Test
    public void setectUserById() {
      User user = userMapper.selectById(5);
        System.out.println(user.toString());
    }

下面是特定sql过滤 过滤特定的方法 也可以在userMapper需要排除的方法上加入注解SqlParser(filter=true) 排除 SQL 解析

配置解析器加入

 paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
                // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
                //你要过滤的userMapper里的方法
                if ("com.hlvy.mybatis_plus.mapper.UserMapper.selectById".equals(ms.getId())) {
                    return true;
                }
                return false;
            }
        });

 

  • 相关 SQL 解析如多租户可通过 @SqlParser(filter=true) 排除 SQL 解析,注意!!
  • 全局配置 sqlParserCache 设置为 true 才生效。(3.1.1开始不再需要这一步)
# 开启 SQL 解析缓存注解生效
mybatis-plus:
  global-config:
    sql-parser-cache: true

你可能感兴趣的:(mybatis_plus)