这里非常感谢,若依作者免费提供的脚手架组件.我在这里只要集成了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为自定义配置包。在写这几行代码的时候会详细说明
如图:
- 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();
}
}
- 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);
}
}
- 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