介绍:
MyBatis Plus 的多租户功能是为了满足企业级应用程序的多租户需求而设计的。
多租户是指在一个应用程序中,存在多个租户(tenant),每个租户可以独立地使用该应用程序的一部分功能。例如,在一个在线商城中,每个商家都是一个租户,他们可以独立地管理自己的商品、订单等信息,而不会影响其他商家的信息。
MyBatis Plus 的多租户功能可以让开发者在设计应用程序时,将租户信息与业务数据分离开来,从而更好地保护数据的安全性和隔离性。多租户功能可以实现以下几个方面的功能:
根据租户ID自动过滤数据,防止不同租户之间的数据混淆。
在运行时自动注入租户ID,减少代码编写量。
支持全局租户和局部租户两种模式,以满足不同场景的需求。
总之,MyBatis Plus 的多租户功能可以帮助开发者快速地实现多租户应用程序,并提高开发效率和数据安全性。
案列:
依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
代码示例:
- 配置 MyBatis Plus 多租户插件
在 MyBatis Plus 的配置文件中,需要配置多租户插件。以下是示例配置代码:
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.weiah.demo.util.TenantIdContextUtil;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MybatisPlusConfig {
private static List<String> ignoreTables = new ArrayList<>();//需要忽略的表
static {
ignoreTables.add("alerttarget");
ignoreTables.add("audit");
ignoreTables.add("audit_error_data");
ignoreTables.add("audit_rectify_relation");
}
/**
* 多租户配置
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
Long tenantId = 1L;
if (TenantIdContextUtil.getTenantLocal() != null)
tenantId = TenantIdContextUtil.getTenantLocal();
return new LongValue(tenantId);
}
// 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
@Override
public boolean ignoreTable(String tableName) {
return ignoreTables.contains(tableName.toLowerCase());
}
@Override
public String getTenantIdColumn() {
return TenantLineHandler.super.getTenantIdColumn();
}
}));
return interceptor;
}
}
扩展
部分场景不需要自动使用租户id,这个时候使用@SqlPaeser注解来忽略当前方法使用多租户功能