首页 > 其他分享 >Mybatis-plus多租户用例

Mybatis-plus多租户用例

时间:2024-05-17 13:52:40浏览次数:18  
标签:lang 租户 public 用例 plus org Mybatis import annotation

我们可以通过注解+配置实现项目多租户数据隔离

注解定义:



import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Tenant {
}
public class TenantContext {
    private static final ThreadLocal<String> TENANT = new ThreadLocal<>();

    public static void setTenant(String tenant) {
        TENANT.set(tenant);
    }

    public static String getTenant() {
        return TENANT.get();
    }

    public static void clear() {
        TENANT.remove();
    }
}

切面配置



import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Aspect @Component public class TenantAspect { @Autowired private MybatisPlusInterceptor mybatisPlusInterceptor; @Before("@annotation(com.example.jdbc.config.Tenant)") public void setTenant(JoinPoint joinPoint) { // 获取租户ID,可以从参数或上下文中获取 String tenantId = "id"; // 这里替换为实际获取租户ID的逻辑 TenantContext.setTenant(tenantId); } @After("@annotation(com.example.jdbc.config.Tenant)") public void clearTenant(JoinPoint joinPoint) { TenantContext.clear(); } }

Mybatis-plus配置



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.StringValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                String tenantId = TenantContext.getTenant();
                if (tenantId != null) {
                    Expression expression= new StringValue(tenantId);
                    return expression;
                }
                return null; // 如果没有租户信息,不添加租户条件
            }

            @Override
            public String getTenantIdColumn() {
                return "tenant_id"; // 替换为实际的租户字段名
            }

            @Override
            public boolean ignoreTable(String tableName) {
                String tenantId = TenantContext.getTenant();
                if (tenantId == null) {
                    return true;
                }
                // 配置不需要租户隔离的表,例如系统表
            }
        }));
        return interceptor;
    }
}

注意:net.sf.jsqlparser.expression.Expression getTenantId() 获取租户 ID 值表达式,只支持单个 ID 值

标签:lang,租户,public,用例,plus,org,Mybatis,import,annotation
From: https://www.cnblogs.com/nxjblog/p/18197673

相关文章

  • 通过mybatisflex获取多数据源mapper
    基于mybatisflex1.8.4:@NoArgsConstructor(access=AccessLevel.PRIVATE)@Slf4jpublicclassDataSource{publicstaticfinalStringA="a";publicstaticfinalStringB="b";publicstaticfinalStringC="c";pub......
  • mybatis-plus mapper整理
    mybatis-plusmapper整理简介提供了操作数据的框架,避免使用jdbc操作数据,加速开发效率,支持多种数据库(databaseId)。既支持sql,mapper的编写,也支持注解@Select等,同时提供了一二级缓存,以及BaseMapper接口以及IService、ServiceImpl这些接口,来提供模板化的方法。同时还支持逆向工程生......
  • 整合mybatis框架
    添加依赖<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>xxx</version></dependency>添加配置文件mybatis:mapper-locations:class......
  • LLM-通义千问:MyBatis-Plus 多租户插件
    MyBatis-Plus(简称MP)是一个对MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。多租户(Multi-Tenant)是一种软件架构技术,它允许多个组织(即“租户”)共享同一应用程序的实例,但每个组织的数据都是隔离且私有的。在多租户场景下,MyBatis-Plus提供了一种插件......
  • vue3 elementplus样式
    科技感日期选择器样式.data_screen.el-picker-panel__footer{color:#87CEEB;background:#00122a;border-top:1pxsolid#274954;}.data_screen.el-picker-panel{color:#87CEEB;background:#00122a;border:1pxsolid#274954;}.data_screen.el-picker-pane......
  • MyBatis-Plus 实现多租户管理的实践
    本文主要讲解使用Mybatis-Plus结合dynamic-datasource来实现多租户管理在现代企业应用中,多租户(Multi-Tenant)架构已经成为一个非常重要的设计模式。多租户架构允许多个租户共享同一应用程序实例,但每个租户的数据彼此隔离。实现这一点可以大大提高资源利用率并降低运营成本。在本......
  • mybatis及mybatis-plus的实体映射
    packagecom.duxiang.backgroundmanagement.entity;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;1.mybatisimportjavax.persistence.*;@Data@AllArgsConstructor@NoArgsConstructor@Table(name="m_chat")/......
  • Mybatis-Plus中 updateById 无法将已有值的字段更新为 null
    在MyBatis-Plus中,使用updateById,null字段并不会更新,其实是和更新的策略有关,当然,也有插入策略。1、调整全局策略(会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null)mybatis-plus:global-config:db-config:insert-stra......
  • Pytest参数化用例
    Pytest参数化用例参数化:通过参数的方式传递数据,从而实现数据与脚本分离,并且可以实现用例的重复生成与执行。装饰器:@pytest.mark.parametrize单参数importpytestsearch_list=["appium","selenium","pytest"]#参数化实现测试用例的动态生成#第一种:单参数情况,每一条......
  • pytest Mark标记测试用例
    Mark标记测试用例场景:只执行符合要求的某一部分用例,可以把一个web项目划分为多个模块,然后指定模块名称执行。解决:在测试用例方法上加@pytest.mark.标签名执行:-m执行自定义标记的相关用例pytest-stest_command_param.py-m=webtestpytest-stest_command_param.py-map......