Java多租户实现

目录

1.使用mybatis-plus多租户插件

异常问题


1.使用mybatis-plus多租户插件

导入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>

1.实现TenantHandler租户接口

2.设置字段为org_id(所有相关的表都要添加这个字段)

3.获取前端登录时传递的组织ID(这个是针对第一次登录没有token,因为后续如果已经登录就可以获取到对应的组织id编号了)

4,如果有些相关的表是共享的不需要做组织隔离那么请在doTableFilte方法中添加对应的表

package com.sys.handler;

import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.sys.entity.User;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.NullValue;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.ArrayList;
import java.util.List;


@Slf4j
@Component
public class PreTenantHandler implements TenantHandler {

    /**
     *
     * @param where 参数 true 表示为 where 条件 false 表示为 insert 或者 select 条件
     * @return   这里获取租户id的实际值,也就是从登陆用户中获取未登录由前端选择的组织id获取
     */
    @Override
    public Expression getTenantId(boolean where) {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 判断用户是否已登录 未登陆从登陆请求头里面获取用户的组织id
        Subject subject = SecurityUtils.getSubject();
        boolean isAuthenticated = subject.isAuthenticated();
        if (isAuthenticated) {
            // 用户已登录
            User principal = (User) subject.getPrincipal();
            Integer id = principal.getOrgId();
            return new LongValue(id);
        } else if (servletRequestAttributes != null){
            // 用户未登录通过用户选择的园区获取数据
            int org = Integer.parseInt(servletRequestAttributes.getRequest().getHeader("org"));
            return new LongValue(org);
        }
        return new NullValue();
    }

    /**
     *
     * @return 这类填写的是表中的字段
     */
    @Override
    public String getTenantIdColumn() {
        return "org_id";
    }

    /**
     * @param tableName 表名
     * @return 这里看是否需要忽略哪些表 true为忽略,false为不忽略 后面做到yml配置文件里面去
     */
    @Override
    public boolean doTableFilter(String tableName) {
        if (tableName.contains("ACT_"))
            return true; //去除流程相关的表
        if (tableName.contains("act_"))
            return true;//去除流程相关的表
 
    }
}

异常问题

1.如果某个查询不想使用组织ID查询怎么办,例如对外接口,那么就没有登录,但是你在查询的时候插件会自动添加org_id这个字段,那么就使用

@SqlParser(filter = true)//这个注解即可

@SqlParser(filter = true)

List<MesFile> getReportUrlList(String applyNumber);

2.mybatis-plus 多租户 lef join bug 会重复on导致sql语句报错

这个时候查询系统是否引入了jsqlparser解析器,原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器 。

解决方法

排除pagehelper-spring-boot-starter的jar中的jsqlparser依赖

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>mybatis-spring</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值