多租户
- 什么是多租户?
- 如何实现多租户?
- DEMO
什么是多租户?
多租户定义:多租户技术或称多重租赁技术,简称SaaS,是⼀种软件架构技术,是实现如何在多⽤户环境下(此处的多⽤户⼀般是面向企业⽤户)共⽤相同的系统或程序组件,并且可确保各⽤户间数据的隔离性。简单讲:在⼀台服务器上运⾏单个应⽤实例,它为多个租户(客户)提供服务。从定义中我们可以理解:多租户是⼀种架构,⽬的是为了让多⽤户环境下使⽤同⼀套程序,且保证⽤户间数据隔离。
那么重点就很浅显易懂了,多租户的重点就是同⼀套程序下实现多⽤户数据的隔离。
如何实现多租户?
1、设计数据库表中的字段包括租户主键tenant_id
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (id)
);
2、定义MybatisPlusConfig配置文件
3、定义租户拦截器TenantLineInnerInterceptor
4、实现TenantLineHandler中的方法
- 租户id的字段名默认是tenant_id
- 获取租户id
- 判断该表是否忽略拼接多租户条件
public interface TenantLineHandler {
/**
* 获取租户 ID 值表达式,只支持单个 ID 值
* <p>
*
* @return 租户 ID 值表达式
*/
Expression getTenantId();
/**
* 获取租户字段名
* <p>
* 默认字段名叫: tenant_id
*
* @return 租户字段名
*/
default String getTenantIdColumn() {
return "tenant_id";
}
/**
* 根据表名判断是否忽略拼接多租户条件
* <p>
* 默认都要进行解析并拼接多租户条件
*
* @param tableName 表名
* @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
*/
default boolean ignoreTable(String tableName) {
return false;
}
}
5、将租户拦截器添加到mybatis拦截器中MybatisPlusInterceptor
DEMO
1.配置文件
package com.baomidou.mybatisplus.samples.tenant.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
/**
* @author miemie
* @since 2018-08-10
*/
@Configuration
@MapperScan("com.baomidou.mybatisplus.samples.tenant.mapper")
public class MybatisPlusConfig {
/**
* 新多租户插件配置,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存万一出现问题
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1);
}
// 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
@Override
public boolean ignoreTable(String tableName) {
return !"user".equalsIgnoreCase(tableName);
}
}));
// 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
// 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return configuration -> configuration.setUseDeprecatedExecutor(false);
// }
}
2、定义好实体、mapper
3、测试
@SpringBootTest
public class TenantTest {
@Resource
private UserMapper mapper;
@Test
public void aInsert() {
User user = new User();
user.setName("一一");
Assertions.assertTrue(mapper.insert(user) > 0);
user = mapper.selectById(user.getId());
Assertions.assertTrue(1 == user.getTenantId());
}
}
添加时没有设置租户id,添加的sql设置了租户Id
查询出来的信息租户id有值,查询的sql条件自动拼上了租户Id
相关文章
暂无评论...