mybatis-plus实现多租户

简介: mybatis-plus实现多租户

我无论作什麽,始终在想着,只要我的精力允许我的话,我就要首先为我的祖国服务。——巴甫

个人理解的多租户:一套产品提供给多个企业使用,每家企业之间的数据相互隔离。例如我有一套运输管理系统,开发完成后,每一家企业购买我们的产品,我只需要提供一个账号,即可拥有完整的内容。如权限管理、订单管理等,他们之间的数据是不互通的

我们可以通过在每张表上加一个租户id去实现这个功能

我们的mybatis-plus版本为3.1.0,这里放上依赖

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

然后我们需要修改配置文件

#mybatis的配置
mybatis-plus:
  config-location: classpath:/mybatis/mybatis-config.xml
  mapper-locations:
    - classpath*:com/ruben/dao/xml/*Mapper.xml
  configuration-properties:
    prefix:
    boolValue: TRUE
    blobType: BLOB
  global-config:
    sql-parser-cache: true

关键是最下面两行sql-parser-cache: true

然后我们需要在Mybatis-Plus的配置类中进行配置

我们之前注入的分页拦截器PaginationInterceptor

当时是这么写的

@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}

现在我们加上配置

package com.ruben.config;
import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.parsers.BlockAttackSqlParser;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
 * @ClassName: MybatisPlusConfig
 * @Description: MybatisPlus配置
 * @Date: 2020/11/21 0021 16:34
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Configuration
@MapperScan("com.ruben.dao.mapper*")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor interceptor = new PaginationInterceptor();
        List<ISqlParser> sqlParserList = new ArrayList<>();
        sqlParserList.add(new BlockAttackSqlParser());
        TenantSqlParser tenantSqlParser = new TenantSqlParser();
        tenantSqlParser.setTenantHandler(new TenantHandler() {
            @Override
            public Expression getTenantId() {
                // 配置租户id,这里我简单使用1作为租户id
                return new LongValue(1);
            }
            @Override
            public String getTenantIdColumn() {
                // 配置租户id字段
                return "tenant_id";
            }
            @Override
            public boolean doTableFilter(String tableName) {
                // 配置是否过滤一些表,例如如果需要过滤 user 表,则:if (tableName.equals('user')) return true;
                return false;
            }
        });
        sqlParserList.add(tenantSqlParser);
        interceptor.setSqlParserList(sqlParserList);
        return interceptor;
    }
}

别忘了在数据库中的表加上字段tenant_id,如果我们的表非常多,可以参考我这篇博客统一加字段

然后如果我们有些sql或者函数不需要加租户条件,则可以使用@SqlParser(filter = true)注解

不过注意,只能在extends com.baomidou.mybatisplus.core.mapper.BaseMapper的类中函数上加该注解才能生效

我们简单测试一下

@Test
public void list() {
    List<UserPO> userList = mpUserMapper.findUserList(UserPO.builder().username("ruben").build());
    userList.forEach(System.out::println);
    LambdaQueryWrapper<UserPO> wrapper = Wrappers.lambdaQuery(UserPO.builder().build());
    wrapper.select(w -> true).inSql(UserPO::getId, "select id from user");
    mpUserMapper.selectList(wrapper);
}

这里红色打印出来的sql就是我们刚刚加了@SqlParser(filter = true)注解的函数

下面蓝色则是使用mybatis-plus封装好的selectList方法,可以看出蓝色里我们配置了租户id后的结果,默认加上了 user.tenant_id = 1条件

这样每个租户之间就实现了相互隔离,非常便利~

相关文章
|
SQL 存储 安全
Spring Boot集成Mybatis-Plus多租户架构实战
Spring Boot集成Mybatis-Plus多租户架构实战
1420 0
Spring Boot集成Mybatis-Plus多租户架构实战
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
1172 15
|
SQL Java 数据库连接
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
1971 1
|
SQL 开发框架 前端开发
SpringCloud微服务实战——搭建企业级开发框架(二十二):基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能
多租户技术的基本概念:   多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。   在云计算的加持之下,多租户技术被广为运用于开发云各式服务,不论是IaaS,PaaS还是SaaS,都可以看到多租户技术的影子。
1640 54
|
SQL 消息中间件 移动开发
使用MyBatisPlus实现多租户功能
使用MyBatisPlus实现多租户功能
使用MyBatisPlus实现多租户功能
|
SQL 缓存 前端开发
基于Mybatis-plus实现多租户架构
基于Mybatis-plus实现多租户架构
1431 0
基于Mybatis-plus实现多租户架构
|
SQL XML Java
基于mybatis-plugin实现多租户应用
为了服务阿里云交付场景,满足原有系统转型多租户场景的数据操作需求,我们基于开源SQL增强插件实现多租户数据操作行为统一处理,应用开发者可以更多的关注业务实现。
1021 0
|
Java 数据库连接 mybatis
java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统--配置中心服务化和高可用
在前两篇的介绍中,客户端都是直接调用配置中心的server端来获取配置文件信息。 这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,server端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理的理念。
2089 0
|
Java 数据库连接 API
java B2B2C springmvc mybatis多租户电子商城系统-服务网关过滤器
过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口都对它们开放。
961 0
|
SQL 前端开发 Java
Mybatis-plus多租户实战进阶
Mybatis-plus多租户实战进阶
634 0