广告
返回顶部
首页 > 资讯 > 数据库 >mybatis-plus 租户处理器
  • 623
分享到

mybatis-plus 租户处理器

mybatis-plus租户处理器 2021-12-26 22:12:22 623人浏览 才女
摘要

配置 租户解析器处理程序 import com.baomidou.mybatisplus.extension.plugins.tenant.TenantsqlParser; import net.sf.jsqlparser.expressi

mybatis-plus 租户处理器

配置

租户解析器处理程序

import com.baomidou.mybatisplus.extension.plugins.tenant.TenantsqlParser;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.*;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.*;

import java.util.List;


public class MpTenantParserHandler extends TenantSqlParser {

	
	protected Expression processTableAlias(Expression expression, Table table) {
		String tableAliasName;
		if (table.getAlias() == null) {
			tableAliasName = table.getName();
		} else {
			tableAliasName = table.getAlias().getName();
		}
		if (expression instanceof InExpression) {
			InExpression in = (InExpression) expression;
			if (in.getLeftExpression() instanceof Column) {
				setTableAliasNameForColumn((Column) in.getLeftExpression(), tableAliasName);
			}
		} else if (expression instanceof BinaryExpression) {
			BinaryExpression compare = (BinaryExpression) expression;
			if (compare.getLeftExpression() instanceof Column) {
				setTableAliasNameForColumn((Column) compare.getLeftExpression(), tableAliasName);
			} else if (compare.getRightExpression() instanceof Column) {
				setTableAliasNameForColumn((Column) compare.getRightExpression(), tableAliasName);
			}
		} else if (expression instanceof Between) {
			Between between = (Between) expression;
			if (between.getLeftExpression() instanceof Column) {
				setTableAliasNameForColumn((Column) between.getLeftExpression(), tableAliasName);
			}
		}
		return expression;
	}

	private void setTableAliasNameForColumn(Column column, String tableAliasName) {
		column.setColumnName(tableAliasName + "." + column.getColumnName());
	}

	
	@Override
	protected Expression builderExpression(Expression currentExpression, Table table) {
		final Expression tenantExpression = this.getTenantHandler().getTenantId(true);
		Expression appendExpression;
		if (!(tenantExpression instanceof SupportsOldoracleJoinSyntax)) {
			appendExpression = new EqualsTo();
			((EqualsTo) appendExpression).setLeftExpression(this.getAliasColumn(table));
			((EqualsTo) appendExpression).setRightExpression(tenantExpression);
		} else {
			appendExpression = processTableAlias(tenantExpression, table);
		}
		if (currentExpression == null) {
			return appendExpression;
		}
		if (currentExpression instanceof BinaryExpression) {
			BinaryExpression binaryExpression = (BinaryExpression) currentExpression;
			if (binaryExpression.getLeftExpression() instanceof FromItem) {
				processFromItem((FromItem) binaryExpression.getLeftExpression());
			}
			if (binaryExpression.getRightExpression() instanceof FromItem) {
				processFromItem((FromItem) binaryExpression.getRightExpression());
			}
		} else if (currentExpression instanceof InExpression) {
			InExpression inExp = (InExpression) currentExpression;
			ItemsList rightItems = inExp.getRightItemsList();
			if (rightItems instanceof SubSelect) {
				processSelectBody(((SubSelect) rightItems).getSelectBody());
			}
		}
		if (currentExpression instanceof OrExpression) {
			return new AndExpression(new Parenthesis(currentExpression), appendExpression);
		} else {
			return new AndExpression(currentExpression, appendExpression);
		}
	}

	@Override
	protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
		FromItem fromItem = plainSelect.getFromItem();
		if (fromItem instanceof Table) {
			Table fromTable = (Table) fromItem;
			if (!this.getTenantHandler().doTableFilter(fromTable.getName())) {
				plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
				if (addColumn) {
					plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.getTenantHandler().getTenantIdColumn())));
				}
			}
		} else {
			processFromItem(fromItem);
		}
		List joins = plainSelect.getJoins();
		if (joins != null && joins.size() > 0) {
			joins.forEach(j -> {
				processJoin(j);
				processFromItem(j.getRightItem());
			});
		}
	}
}

租户处理器


@Component
@AllArgsConstructor
public class MpTenantHandler implements TenantHandler {

	private final HeaderHolder headerHolder;

	
	@Override
	public Expression getTenantId(boolean where) {
		Long tid = headerHolder.findTid();
		return new LongValue(tid);
	}

	
	@Override
	public String getTenantIdColumn() {
		return "tid";
	}

	@Override
	public boolean doTableFilter(String tableName) {
		//TODO 如果是超级租户 不进行过滤
		return Objects.equals(headerHolder.getTid(), 1L);
	}
}

MP配置


@Configuration
public class MybatisPlusConfig {

    
    @Bean
    public PaginationInterceptor paginationInterceptor(MpTenantHandler mpTenantHandler) {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

        List sqlParserList = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new MpTenantParserHandler();
        // 解析处理拦截器
        tenantSqlParser.setTenantHandler(mpTenantHandler);

        sqlParserList.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParserList);
        return paginationInterceptor;
    }
}

租户字段处理

public class BaseEntity {
    
    @TableField(insertStrategy = FieldStrategy.NEVER,
            updateStrategy = FieldStrategy.NEVER)
    private Long tid;
}

插入和更新时租户字段由租户处理器接管,mp自带的增删改查不再有租户字段

查询

插入


    @Override
    public void processInsert(Insert insert) {
        if (tenantHandler.doTableFilter(insert.getTable().getName())) {
            // 过滤退出执行
            return;
        }
        insert.getColumns().add(new Column(tenantHandler.getTenantIdColumn()));
        if (insert.getSelect() != null) {
            processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true);
        } else if (insert.getItemsList() != null) {
            // fixed github pull/295
            ItemsList itemsList = insert.getItemsList();
            if (itemsList instanceof MultiExpressionList) {
                ((MultiExpressionList) itemsList).getExprList().forEach(el -> el.getExpressions().add(tenantHandler.getTenantId(false)));
            } else {
                ((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId(false));
            }
        } else {
            throw ExceptionUtils.mpe("Failed to process multiple-table update, please exclude the tableName or statementId");
        }
    }

更新


@Override
public void processUpdate(Update update) {
    final Table table = update.getTable();
    if (tenantHandler.doTableFilter(table.getName())) {
        // 过滤退出执行
        return;
    }
    update.setWhere(this.andExpression(table, update.getWhere()));
}

删除


@Override
public void processDelete(Delete delete) {
    if (tenantHandler.doTableFilter(delete.getTable().getName())) {
        // 过滤退出执行
        return;
    }
    delete.setWhere(this.andExpression(delete.getTable(), delete.getWhere()));
}
您可能感兴趣的文档:

--结束END--

本文标题: mybatis-plus 租户处理器

本文链接: https://www.lsjlt.com/news/5533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis-plus 租户处理器
    配置 租户解析器处理程序 import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; import net.sf.jsqlparser.expressi...
    99+
    2021-12-26
    mybatis-plus 租户处理器
  • SpringBoot集成Mybatis-Plus多租户架构实现
    目录一. 什么是多租户二. 多租户架构以及数据隔离方案1. 独立数据库2. 共享数据库,独立 Schema3. 共享数据库,共享 Schema,共享数据表三.多租户架构适用场景?四....
    99+
    2022-11-12
  • Mybatis-plus多租户项目实战进阶指南
    在基于Mybatis-plus实现多租户架构中,介绍了在多租户项目中如果要开启一个子线程,那么需要手动进行RequestAttributes的子线程共享。如果应用场景较少的话可能也不...
    99+
    2022-11-13
  • 如何使用Mybatis-plus实现多租户架构
    这篇文章给大家分享的是有关如何使用Mybatis-plus实现多租户架构的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。多租户(Multi-Tenant)是SaaS中的一个重要概念,它是一种软件架构技术,在多个租户...
    99+
    2023-06-29
  • Mybatis plus多租户方案的实战踩坑记录
    目录(一).方案(二).官方多租户的方案的优化和坑1.分析哪些需要加多租户,哪些不需要加2.jsqlparser 这个包与pagehelper 版本不对3.sql解析失败4.忽略多租...
    99+
    2022-11-12
  • Mybatis plus多租户方案的实战踩坑分析
    这篇文章主要介绍“Mybatis plus多租户方案的实战踩坑分析”,在日常操作中,相信很多人在Mybatis plus多租户方案的实战踩坑分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-25
  • Mybatis和Mybatis-Plus对MySQL中json类型处理
    文章目录 1 MySQL中json类型处理1.1 引言1.2 准备建表1.3 Mybatis1.3.1 实体类1.3.2 BaseTypeHandler1.3.3 application.ym...
    99+
    2023-10-10
    mybatis mysql json
  • 基于Mybatis-plus实现多租户架构的全过程
    多租户(Multi-Tenant)是SaaS中的一个重要概念,它是一种软件架构技术,在多个租户的环境下,共享同一套系统实例,并且租户之间的数据具有隔离性,也就是说一个租户不能去访问其...
    99+
    2022-11-13
  • 使用Mybatis-Plus时的SqlSessionFactory问题及处理
    目录使用Mybatis-Plus的SqlSessionFactory问题贴一下这两个类的源码,看一眼就明白了还有MybatisSqlSessionFactoryBean的spring...
    99+
    2022-11-12
  • mybatis plus更新字段为null处理方法
    目录测试代码如下数据库表实体类mappercontroller运行测试运行测试mybatis plus 将字段更新为 null,默认如果不做任何处理,使用 mybatis plus ...
    99+
    2022-11-13
  • mybatis-plus更新字段为null的处理方式
    目录mybatis-plus更新字段为null处理该如何设置?mybatis-plus将字段修改为null注意事项mybatis-plus更新字段为null处理 在mybatis-p...
    99+
    2022-11-13
  • Mybatis-Plus自定义集合类型的类型处理器详解
    目录1.配合xml文件2.手动注册两种方法,第一种很麻烦,对mp自带的插入操作有限制,后来改为更简洁的第二种方法 1.配合xml文件 TypeHandler @Slf4j @Map...
    99+
    2022-11-12
  • Mybatis-Plus怎么自定义集合类型的类型处理器
    这篇文章主要讲解了“Mybatis-Plus怎么自定义集合类型的类型处理器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis-Plus怎么自定义集合类型的类型处理器”吧!1.配合x...
    99+
    2023-06-26
  • mybatis-plus读取JSON类型并处理JSON中数据
    mybatis-plus读取JSON类型 本文总共三个步骤: 1、在数据库表定义JSON字段; 2、在实体类加上@TableName(value = “extra_info”, autoResultM...
    99+
    2023-09-04
    json spring boot mybatis mysql
  • mybatis-plus拦截器、字段填充器、类型处理器、表名替换、SqlInjector(联合主键处理)
    目录组件介绍表名处理器字段填充器类型处理器补充最近有个练手的小例子,大概就是配置两个数据源,从一个数据源读取数据写到另一个数据源,虽然最后做了出来,但是不支持事务。。。就当是对myb...
    99+
    2022-11-12
  • Mybatis Plus 新版lambda 表达式查询异常的处理
    目录新版lambda 表达式查询异常注意点lambda表达式异常应该如何处理我们看一个例子新版lambda 表达式查询异常 在使用新版Mybatis Plus工具时,新增的查询有支持...
    99+
    2022-11-12
  • MyBatis-Plus非表字段的三种处理方法小结
    目录MyBatis-Plus非表字段的处理方式1、使用关键字2、关键字static3、使用@TableField注解mybatisplus 非数据库字段设置使用transient修饰...
    99+
    2022-11-12
  • 使用Mybatis-Plus时的SqlSessionFactory问题及处理是怎样的
    这篇文章给大家介绍使用Mybatis-Plus时的SqlSessionFactory问题及处理是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Mybatis-Plus时的SqlSessionFactory问题...
    99+
    2023-06-22
  • Mybatis Plus的lambda表达式查询异常的处理方法
    今天小编给大家分享一下Mybatis Plus的lambda表达式查询异常的处理方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-06-26
  • mybatis-plus雪花算法自动生成机器id原理及源码
    目录1、雪花算法原理2、自动生成唯一机器号源码1、雪花算法原理         雪花算法使用一个 64...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作