Mybatis-Plus简单实现多租户
AI-摘要
Tianli GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
1、前言
一套产品提供给多个企业使用,每家企业之间的数据相互隔离。例如我有一套运输管理系统,开发完成后,每一家企业购买我们的产品,我只需要提供一个账号,即可拥有完整的内容。如权限管理、订单管理等,他们之间的数据是不互通的
这里实现使用的一种简单的实现方式。我们可以通过在每张表上加一个租户id去实现这个功能
2、引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
3、修改配置文件
#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的配置类中进行配置
4、完善分页拦截器
- 我们通常会使用Mybatis提供的分页拦截器,这里是最开始注入的分页拦截器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;
@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;
}
}
PS:别忘了在数据库中的表加上字段tenant_id
- 然后如果我们有些sql或者函数不需要加租户条件,则可以使用@SqlParser(filter = true)注解
@Mapper
public interface UserMapper extends BaseMapper<User> {
@SqlParser(filter =true)
User selectById(Integer id);
}
不过注意,只能在继承了com.baomidou.mybatisplus.core.mapper.BaseMapper的类中函数上加该注解才能生效
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 leaflei
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果