【MyBatis基础】SpringBoot集成MyBatisPlus的基于字段隔离的多租户实现

文章介绍了多租户的概念,包括三种数据存储的实现方式:独立数据库、独立schema和共享schema通过tenant_id区分。重点讲述了基于MyBatisPlus的字段隔离实践,通过插件机制和TenantLineInnerInterceptor实现租户数据隔离,并提供了配置示例。同时,提醒启用多租户不等同于权限过滤,应注意租户间的完全隔离。
摘要由CSDN通过智能技术生成

摘要:多租户的含义是让多用户共用相同的系统或组件,但是又能保证各个用户之间数据是隔离的。多租户技术可以实现多个租户共用系统实例,而且同时能实现系统实例的个性化定制。

1. 多租户在数据存储上的实现方式

  • 每个租户有自己独立的数据库

这种方式隔离级别最高,但是成本也最高。

  • 租户共用数据库,但是有自己独立的schema(数据架构)

这种方式能支持更多的租户,但是如果出现故障,可能会使不同租户的数据之间产生牵连。

  • 租户共用数据库,且共享schema(数据架构),通过tenant_id字段区分租户

这种方式隔离级别最低,成本也最低,但是共享程度最高。

2. 基于字段的隔离方式实践

该种方式利用的是MyBatis的插件机制。

首先引入maven依赖。

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

yml中添加配置项。

mybatis-plus:
  configuration:
    cache-enabled: true
    use-generated-keys: true
    default-executor-type: REUSE
    use-actual-param-name: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

MyBatisPlus配置类

@Configuration
public class MyBatisConfig {

    /**
     * inject pagination interceptor.
     *
     * @return pagination
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        return new PaginationInnerInterceptor();
    }

    /**
     * add interceptor.
     *
     * @return MybatisPlusInterceptor
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // TenantLineInnerInterceptor
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                // 实际可以将TenantId放在threadLocale中(比如xxxxContext中),并获取。
                return new LongValue(1);
            }

            @Override
            public String getTenantIdColumn() {
                return "tenant_id";
            }

            @Override
            public boolean ignoreTable(String tableName) {
                return false;
            }

            @Override
            public boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
                return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);
            }
        }));
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

3. 补充

来自MyBatisPlus官方的注意点。

  • 多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!!
  • 启用多租户后所有执行的method的sql都会进行处理。
  • 自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天`南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值