代码起步:MyBatis-Plus 多租户插件

        这是简单的起步代码,基于Spring Boot。

1 代码

        在一个控制器里添加代码,控制器是带有@Configuration的类,将如下代码添加在控制器类里面:

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler()
        {
            @Override
            public Expression getTenantId()
            {
                //获得当前登录用户的租户id,一般是从cookies里面获取,这里用了固定值
                return new LongValue(1234);
            }
        }));
        return interceptor;
    }

        需要的导入包:

import org.springframework.context.annotation.Bean;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.LongValue;

        其余代码无需修改,但是建议删除租户相关的部分,因为如果已经传入租户ID,这个插件什么也不做。

  2 完整接口

        完整的TenantLineHandler是这样的(来自官方文档):

public interface TenantLineHandler {

    /**
     * 获取租户 ID 值表达式,只支持单个 ID 值
     * 

* * @return 租户 ID 值表达式 */ Expression getTenantId(); /** * 获取租户字段名 *

* 默认字段名叫: tenant_id * * @return 租户字段名 */ default String getTenantIdColumn() { // 如果该字段你不是固定的,请使用 SqlInjectionUtils.check 检查安全性 return "tenant_id"; } /** * 根据表名判断是否忽略拼接多租户条件 *

* 默认都要进行解析并拼接多租户条件 * * @param tableName 表名 * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件 */ default boolean ignoreTable(String tableName) { return false; } }

        一共就三个方法,由于我的表的租户字段名和默认值一致,所以不需要实现更多方法。

3 实测效果

        如果没有传入租户ID,就会调用这里定义的getTenantId来获取租户ID,如果已经传入了租户ID,则不会调用。

4 讨论

        其实我希望强制覆盖传入的租户ID,这样才能防止出错。

        另外数据库里面如何合理实现,还是个问题。

        以前发生过事故,用户看到了不该看的东西。

(这里是文档结束)

你可能感兴趣的:(Java,mybatis,java,servlet)