springboot的多租户 Mybatis-plus 租户拦截器实践

353 阅读2分钟

theme: juejin

项目需要支持多个机构配置节日福利领取活动,提供多租户支持,技术实现方案参考该文章, 本文主要记录使用过程中遇到的问题和处理

  1. 就当前的系统情况和使用数量,没有使用分库的租户实现方案,也没有实现动态表名的实现方案,有兴趣后续会做尝试,并做记录,这里给自己挖个坑。方案是使用mp提供的租户拦截器实现的(在表中添加tenant_id字段),在mp生成查询sql的阶段拦截并添加租户条件,具体实现参考上文这里不赘述,主要是讲讲具体操作过程中的一些问题和处理方案,做一下记录也给大家提供一下参考

  2. 在添加多租户拦截器时,需要注意如果使用了mp的分页拦截器,需要先添加租户拦截器,后添加分页拦截器,否则两者会产生冲突并提示sql中的字符的语法不支持,并且在一些情况下,由于mybatis-plus包与原本存在的pagehelper存在com.github.jsqlparser:jsqlparser冲突会导致Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token 异常,处理方式是排除mybatis-plus中的

    <!-- mybatis -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
        <exclusions>
            <exclusion>
                <artifactId>jsqlparser</artifactId>
                <groupId>com.github.jsqlparser</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>4.2</version>
    </dependency>
    
  3. 多租户场景下并非所有的表都需要区分租户,具体当前项目比如省市区编码信息表,租户表本身,一些中间表。这些表需租户拦截器进行忽略,实现方式是重写 TenantLineHandler.ignoreTable 方法,设置需要忽略的表名。具体实现过程中有部分表进行了设置但是仍被拦截器添加了租户条件,追踪代码后确认问题是传入的表名参数带反引号, 配置的忽略表名是不带反引号,后续将两种表名情况都进行了配置,问题解决

  4. 也有一些表是需要租户id的,但是在一些情况下又需要不添加租户的查询,比如当前项目中设置的定时任务,项目启动时需要将所有激活的定时任务进行加载,此时需要全部租户的定时任务而不是单个租户,定时任务表需要租户id但启动函数加在激活的定时任务的查询要排除这个,这里使用mp提供的 @InterceptorIgnore(tenantLine = "true") 使当前查询不添加租户条件(该注解需要再mapper.java文件中使用),注解如果放在方法上,则该方法查询不添加租户条件,注解添加在类上,则当前类所有方法都不添加租户条件