【Mybatis-Plus进阶学习(六)】多租户SQL解析器

摘要:
共享数据库,独立模式:同一个数据库,但不同的用户有自己的模式或用户,这在逻辑上对具有高安全性的用户是隔离的,可以被更多租户使用。然而,出现问题时很难恢复,因为其他租户的数据会受到影响。维护成本最低,支持用户最多,安全性能低,数据库备份和恢复成本高。在特定SQL筛选之前,最低的多租户模式位于表级别,而SQL筛选位于语句级别//筛选器方法paginationInterceptor。setSqlParserFilter;返回true,这意味着过滤掉此方法,即不添加租户ID。

多租户是一种结构,就是让多个用户(一般是企业)共同使用同一个系统,但是做到数据隔离,互不干涉。

独立数据库:隔离级别最高,有助于数据库的扩展,满足客户的不同需求,出现问题恢复比较方便。但是创建和维护成本也增加了。
共享数据库,独立Schema:同一个数据库,但是不同的用户拥有自己的schema或者user,为安全性较高的用户进行逻辑隔离,可以供更多的租户使用。但是出现问题恢复较难,因为会影响到其他租户的数据。
共享数据库,共享Schema,共享数据库表:在表中添加租户ID,共享程度最高,隔离级别最低。维护成本最低,支持用户最多,安全性能较低,数据库备份还原成本高。

多租户的简单使用

依赖于分页插件,这里演示第三种多租户方案,以Manage_Id作为租户Id。

首先需要添加分页插件,具体如下:

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        ArrayList<ISqlParser> sqlParsers = new ArrayList<>();
        TenantSqlParser tenantSqlParser = new TenantSqlParser();

        tenantSqlParser.setTenantHandler(new TenantHandler() {
            @Override
            public Expression getTenantId() {
                //这里我们为了演示,直接写死。
                return new LongValue(1088248166370832385L);
            }

            @Override
            public String getTenantIdColumn() {
                //表中的字段名,不是属性名
                return "manager_id";
            }

            @Override
            public boolean doTableFilter(String tableName) {
                //加不加租户信息,false就是加
                if ("role".equals(tableName)) {
                    //role表不加,虽然这个demo里面没有role,但是大家理解就行
                    return true;
                }
                return false;
            }
        });
        //加载
        sqlParsers.add(tenantSqlParser);
        paginationInterceptor.setSqlParserList(sqlParsers);
        return paginationInterceptor;
    }

【Mybatis-Plus进阶学习(六)】多租户SQL解析器第1张

除了查询,增加修改和删除都是一样的。

特定SQL过滤

之前多租户的模式最低也是表级别的,而SQL过滤就是语句级别的了。

实现这SQL过滤有两个方法:

  1. 在分页插件中使用setSqlParserFilter,进行crud的过滤,让这些curd不增加租户标识。
//过滤方法
        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
            @Override
            public boolean doFilter(MetaObject metaObject) {
                MappedStatement mappedStatement = SqlParserHelper.getMappedStatement(metaObject);
                if ("com.fang.dao.UserMapper.selectById".equals(mappedStatement.getId())) {
                    return true;
                }
                return false;
            }
        });

【Mybatis-Plus进阶学习(六)】多租户SQL解析器第2张

返回ture,意思是将这个方法过滤掉,也就是不加租户Id。false反之。

  1. 使用注解
    @SqlParser(filter = true)
    @Select("select * from user ${ew.customSqlSegment}")
    List<User> mySelectList(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

如果你是3.1.1之前的版本,还需要再application.properties中添加配置mybatis-plus.global-config.sql-parser-cache=true

免责声明:文章转载自《【Mybatis-Plus进阶学习(六)】多租户SQL解析器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP开发APP接口实现--基本篇SQL Server 阻止了对组件“Ad Hoc Distributed Queries”的 STATEMENT“OpenRowset/OpenDatasource”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“Ad Hoc Distributed Queries”。有关启用“Ad Hoc Distributed Queries”下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

海思MPP视频处理平台流程简介

海思MPP视频处理平台流程介绍海思芯片系统概述首先,让我们了解海思芯片SOC。下图是hi3519A芯片设计图。图1是hi3519AV100芯片设计图。芯片设计图有助于我们全面了解海思的图像处理。从上图中,我们可以看到许多控制芯片集成在芯片SOC中,例如用于深度学习的NNIE硬核、IVE硬核、视频编码和解码单元H265/H264Codec以及图像处理单元ISP...

powerdesigner与数据库之间的连接

useUnicode=true&characterEncoding=UT8&serverTimezone=UTC 9JDBCdriverjarfiles:指定连接的jar包路径。测试连接。连接成功。进入工作区。3.2 3.2powerdesigner连接到oracle。其原理与连接MySQL的原理相同。在已安装的oracle下找到ojdbc1...

unity, 设置帧率上限

使用unity制作演示,并移除所有昂贵的特效。在真正的机器上运行仍然会导致问题。最大显示帧速率为30。默认情况下,IOS设备上统一的原始帧速率限制为30。应用targetFrameRate=60;更改为最大值60。请注意,此设置对编辑器没有影响。...

TabWidget修改tab颜色,自定义样式

您可以通过tabWidget-˃setStyleSheet方法设置样式,包括选项卡样式。...

Foxyproxy 火狐代理插件

Firefox上的插件Autoproxy一直很难使用。它永远不能更新规则,但foxyproxy可以替代它。用鼠标中键单击foxyproxy图标以在不同的代理方法之间切换。foxyproxy图标从foxhead变为蓝色,因为内容传输发生在网页中,该传输通过默认代理服务器,默认代理的初始颜色为蓝色。...

WPF绑定功能常用属性介绍

这是实质上是System.Windows.Data.BindingMode.OneWay绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用System.Windows.DependencyProperty.GetMetadata获取属性的属性元数据,然后检查System.Windows.Fr...