赞
踩
多租户定义:多租户技术或称多重租赁技术,简称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中的方法
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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。