github地址https://github.com/heng1234/mybatis_plus
基于https://blog.csdn.net/qq_39313596/article/details/100901642文章
使用场景 一个系统多个不同用户查询不同用户的数据
manager_id用于作为多租户id查询
在
MybatisPlusConfig加入多租户解析器
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
/*
* 【测试多租户】 SQL 解析处理拦截器<br>
* 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
*/
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
/* @Override
public Expression getTenantId(boolean where) {
// 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用
// 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程
return new LongValue(1L);
}*/
@Override
public Expression getTenantId() {
return new LongValue(5L);//传入的值一般都是配置文件 静态变量或者session中取出
}
@Override
public String getTenantIdColumn() {
return "manager_id";//多租户字段
}
@Override
public boolean doTableFilter(String tableName) {
// 这里可以判断是否过滤表
/*
if ("user".equals(tableName)) {
return true;
}*/
return false;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
/* paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
@Override
public boolean doFilter(MetaObject metaObject) {
MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
// 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
return true;
}
return false;
}
});*/
return paginationInterceptor;
}
测试: 会在sql的where中加入一个manager_id = xxx
/**
* 根据id查询
* 多租户测试
* Consume Time:13 ms 2019-09-17 22:53:39
* Execute SQL:SELECT id, name, age, email, manager_id, created_time, update_time, version FROM User WHERE User.manager_id = 5 AND id = 5 AND deleted = 0
*/
@Test
public void setectUserById() {
User user = userMapper.selectById(5);
System.out.println(user.toString());
}
下面是特定sql过滤 过滤特定的方法 也可以在userMapper需要排除的方法上加入注解SqlParser(filter=true)
排除 SQL 解析
配置解析器加入
paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
@Override
public boolean doFilter(MetaObject metaObject) {
MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
// 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
//你要过滤的userMapper里的方法
if ("com.hlvy.mybatis_plus.mapper.UserMapper.selectById".equals(ms.getId())) {
return true;
}
return false;
}
});
- 相关 SQL 解析如多租户可通过
@SqlParser(filter=true)
排除 SQL 解析,注意!! 全局配置 sqlParserCache 设置为 true 才生效。(3.1.1开始不再需要这一步)
# 开启 SQL 解析缓存注解生效
mybatis-plus:
global-config:
sql-parser-cache: true