mybatisPlus多租户

2年前 (2022) 程序员胖胖胖虎阿
271 0 0

多租户

  • 什么是多租户?
  • 如何实现多租户?
  • 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
mybatisPlus多租户
mybatisPlus多租户
查询出来的信息租户id有值,查询的sql条件自动拼上了租户Id
mybatisPlus多租户
mybatisPlus多租户

版权声明:程序员胖胖胖虎阿 发表于 2022年11月14日 上午1:16。
转载请注明:mybatisPlus多租户 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...