ruoyi-cloud 整合mybatis-plus多租户功能

这里非常感谢,若依作者免费提供的脚手架组件.我在这里只要集成了mybatis-plus得多租户功能!若依配置和其他问题,作者在官网网站已经配好!还要感谢mybatis-plus作者提供增强myabtis得插件
若依官网: link git地址: linkmybatis-plus: link

1.导入依赖

我们找到pom主文件中标签,定义mybatis-plus版本注意的是pagehelper的版本必须要低于mybatis-plus的版本,两个框架都使用了jsqlparser这个框架,两个版本假如不一致,会导致新增报错.或者换种说法我们以mybatis-plus的jsqlparser的版本为主这样就不会报错,因为我们mapper层的框架使用的mybatis-plus,就是说mybatis-plus的jsqlparser版本要比pagehelper这个版本要高!!!

如果pagehelper中的jsqlpase比mybatis-plus的高会报如下错误

net.sf.jsqlparser.statement.select.SetOperationList cannot be cast to net.sf.jsqlparser.statement.select.PlainSelect

我们找到pom.xml文件,在<properties></properties>标枪中定义mybatis-plus的版本

<properties>
  <com.baomidou.mybatisplus.version>3.5.2</com.baomidou.mybatisplus.version>
  <pagehelper.boot.version>1.4.2</pagehelper.boot.version>
</properties>

然后在<dependencyManagement></dependencyManagement>中声明依赖

  <dependencyManagement>
     <dependencies>
          <!-- pagehelper 分页插件 -->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper-spring-boot-starter</artifactId>
          <version>${pagehelper.boot.version}</version>
        </dependency>
         <!-- mybatisplus接口 -->
         <dependency>
            <groupId>hntc.lims</groupId>
            <artifactId>hntc-lims-common-mybatisplus</artifactId>
            <version>${hntc-lims.version}</version>
         </dependency>  
  </dependencyManagement>

2.新增模块

我们在common这边新增一个mybatisplus的模块
在这里插入图片描述
然后把mybatisplus模块引入到主工程下,然后其他模块就可以使用多租户插件了
在这里插入图片描述
然后我是在core模块下引用的mybatis-plus模块没有在mybatis-plus应用你们也可以在mybatisplus模块下引用mybatis-plus插件,看个人写法,要注意的是假如要兼容pagehelp模块需要把pagehelp的mybatis和springmybaits排除掉,如下
在这里插入图片描述

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

<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>   
   </exclusions>
</dependency>

然后在mybatisplus模块引用core模块,如下,这里就不贴代码了,因为你的模块名和我的不一样!
在这里插入图片描述

3.mybatis-plus配置

我们搭建好mybatisplus模块之后,我们就要开始着手于,mybatis-plus多租户插件的配置了!我们分为三个包,config,handler,properties这三个包。config为配置包,handler为重写mybaits-plus的包,properties为自定义配置包。在写这几行代码的时候会详细说明
如图:
在这里插入图片描述

  1. config配置代码如下,这里没有多说的啦!重要的一点是,我们重写的多租户插件的时候,自定义配置请使用构造注入!这里我还没弄明白,有知道的大佬可以告诉我一下!
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.hnohm.lims.common.mybatisplus.handler.HntcLimsTenantLineHandler;
import com.hnohm.lims.common.mybatisplus.properties.MyTenantConfigProperties;
import lombok.AllArgsConstructor;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * Mybatis Plus 配置
 *
 * @author ruoyi
 */
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
@EnableConfigurationProperties(MyTenantConfigProperties.class)
@AllArgsConstructor
public class MybatisPlusConfig {

    /**
     * 多租户配置类
     */
    private  MyTenantConfigProperties myTenantConfigProperties;

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 多租户插件
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new HntcLimsTenantLineHandler(myTenantConfigProperties)));
        // 分页插件(ps:如果项目中有用到分页插件可以添加如下这行代码,但是必须要写在多租户插件后面)
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        // 阻断插件
        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

    /**
     * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
     */
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

    /**
     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
     */
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }

    /**
     * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
     */
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
        return new BlockAttackInnerInterceptor();
    }
}
  1. handler类中,这是我们重写mybatis-plus多租户插件的方法代码,
    我们需要重写mybatis-plus中的TenantLineHandler这个类,便于我们灵活化的实现自己项目中的业务,然后mybatis-plus官网有这个文档的详解链接: link,请大家多多参考
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.hnohm.lims.common.mybatisplus.properties.MyTenantConfigProperties;
import com.hnohm.lims.common.security.utils.SecurityUtils;
import lombok.AllArgsConstructor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 租户配置管理器
 *
 * @author sanshui
 */
@Component
@AllArgsConstructor
public class HntcLimsTenantLineHandler implements TenantLineHandler {

    private static final Logger log = LoggerFactory.getLogger(HntcLimsTenantLineHandler.class);

    private MyTenantConfigProperties myTenantConfigProperties;

    /**
     * 获取租户字段名
     *
     * @return 租户字段名
     */
    @Override
    public String getTenantIdColumn() {
        return myTenantConfigProperties.getColumn();
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     * <p>
     * 默认都要进行解析并拼接多租户条件
     *
     * @param tableName 表名
     * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
     */
    @Override
    public boolean ignoreTable(String tableName) {
        //todo 租户id大家可以在redis,cookies中拿,这里看大家怎么方便
        //获取租户id 
        Long tenantId = SecurityUtils.getTenantId();
        log.info("当前租户id:{}" , tenantId);
        // 租户中ID,查询全部,不进行过滤 超级管理员过滤全部
        if (tenantId.equals(1L)) {
            return Boolean.TRUE;
        }
        return myTenantConfigProperties.getTables().contains(tableName);
    }


    /**
     * 获取租户 ID 值表达式,只支持单个 ID 值
     *
     * @return 租户 ID 值表达式
     */
    @Override
    public Expression getTenantId() {
        String tenantId = SecurityUtils.getTenantId().toString();
        log.info("当前租户id:{}" , tenantId);
        //获取当前租户
        return new StringValue(tenantId);
    }
}

  1. properties代码如下,我们需要在nacos配置中加上自定义配置
    column这个字段是你需要的租户id,可以自己配置tables这个集合是有一些是不需要租户id的表可以自行配置,可以在nacos配置中动态的更新这些字段


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;

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

/**
 * 多租户配置
 *
 * @author sanshui
 */
@Data
@RefreshScope
@ConfigurationProperties(prefix = "hntc-lims.tenant")
public class MyTenantConfigProperties {

    /**
     * 维护租户列名称
     */
    private String column = "tenant_id";

    /**
     * 不是多租户表的集合
     */
    private List<String> tables = new ArrayList<>();
}

nacos配置如下:

# 租户表维护
hntc-lims:
  tenant:
    column: tenant_id
    tables: 
        - sys_config
        - gen_table_column

4.修改生成代码这里我就补贴了,我帮大家找到了一个博客,链接如下,大家也可以参考他的修改方法

修改生成代码

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田三水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值