mybatisplus多租户原理略解

这篇具有很好参考价值的文章主要介绍了mybatisplus多租户原理略解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

当前mybatisPlus版本

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

jdk版本:17
springboot版本:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>3.1.2</version>
</dependency>

业务中想按照租户划分权限时,一般简单的就是在表里加个字段,但是这样每个sql语句都要改造,很不方便。

mybatisplus有个现成的租户插件
com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor
在配置租户插件之前,需要在token中先塞入租户id,方便后面在拦截器中获取当前用户的租户.

租户注入的关键代码在
com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor#buildTableExpression
mybatisplus多租户原理略解,mybatis,springboot,mybatis

配置

配置的时候租户拦截器需要放在第一个,即`index=0

package org.qps.common.tenant.handle;

import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import org.qps.common.core.utils.StringUtils;
import org.qps.common.satoken.utils.LoginHelper;
import org.qps.common.tenant.helper.TenantHelper;
import org.qps.common.tenant.properties.TenantProperties;
import lombok.AllArgsConstructor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.NullValue;
import net.sf.jsqlparser.expression.StringValue;

import java.util.List;

/**
 * 自定义租户处理器
 *
 */
@AllArgsConstructor
public class PlusTenantLineHandler implements TenantLineHandler {

    private final TenantProperties tenantProperties;

    @Override
    public Expression getTenantId() {
        String tenantId = LoginHelper.getTenantId();
        if (StringUtils.isBlank(tenantId)) {
            return new NullValue();
        }
        String dynamicTenantId = TenantHelper.getDynamic();
        if (StringUtils.isNotBlank(dynamicTenantId)) {
            // 返回动态租户
            return new StringValue(dynamicTenantId);
        }
        // 返回固定租户
        return new StringValue(tenantId);
    }

    @Override
    public boolean ignoreTable(String tableName) {
        String tenantId = LoginHelper.getTenantId();
        // 判断是否有租户
        if (StringUtils.isNotBlank(tenantId)) {
            // 不需要过滤租户的表
            List<String> excludes = tenantProperties.getExcludes();
            // 非业务表
            List<String> tables = ListUtil.toList(
                "gen_table",
                "gen_table_column"
            );
            tables.addAll(excludes);
            return tables.contains(tableName);
        }
        return true;
    }

}









package org.qps.common.tenant.config;

import cn.dev33.satoken.dao.SaTokenDao;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import org.qps.common.core.utils.reflect.ReflectUtils;
import org.qps.common.mybatis.config.MybatisPlusConfig;
import org.qps.common.redis.config.RedisConfig;
import org.qps.common.redis.config.properties.RedissonProperties;
import org.qps.common.tenant.core.TenantSaTokenDao;
import org.qps.common.tenant.handle.PlusTenantLineHandler;
import org.qps.common.tenant.handle.TenantKeyPrefixHandler;
import org.qps.common.tenant.manager.TenantSpringCacheManager;
import org.qps.common.tenant.properties.TenantProperties;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.SingleServerConfig;
import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;

import java.util.ArrayList;
import java.util.List;

/**
 * 租户配置类
 *
 * TenantProperties 自定义租户配置对象
 * MybatisPlusConfig 自定义mybatisPlus配置,维护了分页拦截器等基础拦截器
 */
@EnableConfigurationProperties(TenantProperties.class)
@AutoConfiguration(after = {MybatisPlusConfig.class})
@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
public class TenantConfig {

    /**
     * 初始化租户配置
     */
    @Bean
    public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor,
                              TenantProperties tenantProperties) {
        List<InnerInterceptor> interceptors = new ArrayList<>();
        // 多租户插件 必须放到第一位
        interceptors.add(tenantLineInnerInterceptor(tenantProperties));
        interceptors.addAll(mybatisPlusInterceptor.getInterceptors());
        mybatisPlusInterceptor.setInterceptors(interceptors);
        return true;
    }

    /**
     * 多租户插件
     */
    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
        return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
    }

}

多租户拦截忽略

启用多租户之后,有些业务sql想查询多个租户的数据或者不想被注入租户id。

那么可以加上com.baomidou.mybatisplus.annotation.InterceptorIgnore
@InterceptorIgnore(tenantLine = "true")
即可忽略

原理可以参考源码
com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor#beforeQuery

com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper#willIgnoreTenantLine

com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper#willIgnore

将注解数据初始化到内存中
com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper#initSqlParserInfoCache(java.lang.Class<?>)文章来源地址https://www.toymoban.com/news/detail-697847.html

到了这里,关于mybatisplus多租户原理略解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis-plus多租户插件

    Mybatis-plus多租户插件是一种用于实现多租户功能的插件,它基于Mybatis框架,通过拦截器机制实现对多租户的支持。该插件的核心组件包括TenantHandler和TenantInterceptor,其中TenantHandler用于处理租户相关的逻辑,如获取租户ID、设置租户信息等;而TenantInterceptor则用于拦截需要处理

    2024年01月19日
    浏览(447)
  • Mybatis plus 多租户方案踩坑记录

    公司的老项目要改造多租户,于是进入了大坑,本文写点遇到的坑以及解决方案,每次遇到问题在网上搜了好久,记录下来,防止以后忘掉。 网上有很多方案,本文只写最后一种,即:表增加租户id,实现数据隔离 方案一:增加租户id,在每一个mapper调用的地方,都手工加上

    2024年02月13日
    浏览(37)
  • mybatis-plus分页total为0,分页失效,mybatis-plus多租户插件使用

    背景:项目使用mybatis分页插件不生效,以及多租户使用时读取配置异常 多租户插件使用遇到的问题: 最开始在MyTenantLineHandler中使用 @Value(\\\"${tables}\\\"),服务启动时能从配置中心拉取到配置,但在运行时获取到的值为空,试了很多方法都不生效,后面将配置中心的配置在调用My

    2024年02月06日
    浏览(52)
  • Mybatis-Plus集成Sharding-JDBC与Flyway实现多租户分库分表

    公司产品部收到了一些重要客户的需求,他们希望能够依赖独立的数据库存储来支持他们的业务数据。与此同时,仍有许多中小客户,可以继续使用公共库以满足其需求。技术实现方面,此前持久层框架使用的Mybatis-plus,部分业务场景使用到了Sharding-JDBC用于分表,另外,我们

    2024年02月05日
    浏览(37)
  • TiDB 多租户方案和原理

    作者: li_zhenhuan 原文来源: https://tidb.net/blog/a55c1d14 有很多文章介绍技术上如何使用多租户,在这里简单说明: CREATE RESOURCE GROUP rg_oltp RU_PER_SEC=4000; ALTER USER app1 RESOURCE GROUP \\\"rg_oltp\\\"; 如上面 SQL 显示,业务1使用 app1 连接到 TiDB 之后可以控制业务1最多只使用 4000 RU 的负载,实现资

    2024年02月12日
    浏览(37)
  • MyBatis与MyBatisPlus的区别

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具 ,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高 效率而生。 官网一共有两个:https://mybatis.plus/ 或 https://mp.baomidou.com/ 。 Mybatis-Plus是由baomidou(苞米豆)组织开发并且开源的,截止写博客时间,该组织共17人。 详细步骤

    2024年02月06日
    浏览(39)
  • 【mybatis和mybatisplus的区别】

    MyBatis 和 MyBatis Plus 都是 Java 语言的持久层框架,但它们之间有以下几个区别: MyBatis 是一个基于 XML 配置文件和 SQL 语句的 ORM 框架,提供了数据持久化的基本功能,如 SQL 映射、缓存管理等。而 MyBatis Plus 在 MyBatis 的基础上进行了扩展,提供了更加丰富的功能特性,如分页插

    2024年02月11日
    浏览(48)
  • SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Data是一个用于简化数据库访问和操作的开源框架,为开发人员提供了一种通用的方式来处理不同类型的数据存储,例如关系型数据库(如MySQL、PostgreSQL、Oracle)和非关系型数据库(如MongoDB、Cassandra、Redis)等。

    2024年02月12日
    浏览(52)
  • 【六】SpringBoot集成MyBatis-yml自动化配置原理详解

            简介:spring boot整合mybatis开发web系统目前来说是市面上主流的框架,每个Java程序和springboot mybatis相处的时间可谓是比和自己女朋友相处的时间都多,但是springboot mybatis并没有得到你的真爱,因为你只是为了养活你女朋友而委曲求全的和spring boot mybatis假意相处。和

    2024年02月10日
    浏览(49)
  • mybatisplus 使用mybatis中的配置、mapper配置文件

    即在和application.properties同级目录下的mybatis目录中创建mybatis的配置文件mybatis-config.xml 其内容如下 方式一的目录结构: 1、在application.properties中再添加一行mapper映射地址 修改mapper映射的配置文件路径,这次不用在和mapper接口的路径一一对应,只需要在resource/mybatis/mapper/UserMa

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包