游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

MybatisPlus怎么实现多租户id的使用?

  前言什么是多租户
  多租户技术(MultiTenancyTechnology)又称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。简单讲:在一台服务器上运行单个应用实例,它为多个租户(客户)提供服务。从定义中我们可以理解:多租户是一种架构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离。那么重点就很浅显易懂了,多租户的重点就是同一套程序下实现多用户数据的隔离隔离方案
  目前基于多租户的数据库设计方案通常有如下三种:1、独立数据库共享数据库2、独立Schema共享数据库3、共享数据库、共享数据表独立数据库
  即一个租户一个数据库。优点
  为不同的租户提供独立的数据库,用户数据隔离级别最高,安全性最好,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。缺点
  数据库维护成本和购置成本的大大增加。共享数据库,独立Schema
  即多个或所有租户共享Database,每个租户一个Schema。什么是Schemaoracle数据库:在oracle中一个数据库可以具有多个用户,那么一个用户一般对应一个Schema,表都是建立在Schema中的,(可以简单的理解:在oracle中一个用户一套数据库表)
  mysql数据库:mysql数据中的schema比较特殊,并不是数据库的下一级,而是等同于数据库。比如执行createschematest和执行createdatabasetest效果是一模一样的优点
  为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可以支持更多的租户数量。缺点
  如果出现故障,数据恢复比较困难,因为恢复数据库将牵扯到其他租户的数据;
  如果需要跨租户统计数据,存在一定困难。这种方案是方案一的变种。只需要安装一份数据库服务,通过不同的Schema对不同租户的数据进行隔离。由于数据库服务是共享的,所以成本相对低廉。共享数据库、共享数据表
  即租户共享同一个Database、同一个Schema,但在表中通过tenantid字段区分租户的数据,表明该记录是属于哪个租户的。这是共享程度最高、隔离级别最低的模式。优点
  所有租户使用同一套数据库,所以成本低廉。缺点
  隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;这种方案和基于传统应用的数据库设计并没有任何区别,但是由于所有租户使用相同的数据库表,所以需要做好对每个租户数据的隔离安全性处理,这就增加了系统设计和数据管理方面的复杂程度。数据备份和恢复最困难,需要逐表逐条备份和还原。
  如果希望以最少的服务器为最多的租户提供服务,并且租户接受以牺牲隔离级别换取降低成本,这种方案最适合。集成
  本文选择的是方案三!如果是自己从零开始进行开发,需要在每条sql上加上tenantid条件。那开发成本特别大。但我们使用的是MybatisPlus,那就不需要如此复杂了,框架已经集成多租户使用。创建表CREATETABLEtesttenant(idint(11)unsignedNOTNULLAUTOINCREMENT,accountvarchar(32)DEFAULTNULL,emailvarchar(64)DEFAULTNULL,tenantidint(10)unsignedDEFAULTNULLCOMMENT租户id,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8;复制代码
  insert语句INSERTINTOtest。testtenant(id,account,email,tenantid)VALUES(1,cxyxj,cxyxj。qq。com,0);INSERTINTOtest。testtenant(id,account,email,tenantid)VALUES(2,awesome,awesome163。com,1);INSERTINTOtest。testtenant(id,account,email,tenantid)VALUES(3,gongj,gongj163。com,2);复制代码
  注意关键字段tenantid。搭建项目依赖
  搭建Boot项目,加入以下依赖:propertiesmaven。compiler。source8maven。compiler。sourcemaven。compiler。target8maven。compiler。targetmybatisplus。version3。5。0mybatisplus。versionpropertiesdependenciesdependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIdversion{mybatisplus。version}versiondependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependencydependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdversion5。1。47versionscoperuntimescopedependencydependencygroupIdorg。projectlombokgroupIdlombokartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootstartertestartifactIdscopetestscopeexclusionsexclusiongroupIdorg。junit。vintagegroupIdjunitvintageengineartifactIdexclusionexclusionsdependencydependencies复制代码实体DatapublicclassTestTenant{TableId(typeIdType。AUTO)privateIntegerid;privateStringaccount;privateStringemail;privateIntegertenantId;}复制代码
  我们的主键类型为int,所以需要修改主键策略,修改为自增,默认使用雪花算法生成全局唯一id,长度为19位。mapper接口publicinterfaceTenantMapperextendsBaseMapperTestTenant{}复制代码MybatisPlusConfigimportcom。baomidou。mybatisplus。extension。plugins。MybatisPlusInterceptor;importcom。baomidou。mybatisplus。extension。plugins。handler。TenantLineHandler;importcom。baomidou。mybatisplus。extension。plugins。inner。TenantLineInnerInterceptor;importnet。sf。jsqlparser。expression。Expression;importnet。sf。jsqlparser。expression。LongValue;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importjava。util。List;ConfigurationpublicclassMybatisPlusConfig{BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor。addInnerInterceptor(newTenantLineInnerInterceptor(newTenantLineHandler(){OverridepublicExpressiongetTenantId(){获得当前登录用户的租户idreturnnewLongValue(1111);}}));returninterceptor;}}复制代码
  在MybatisPlus中,一切插件的主体是InnerInterceptor。目前已有的功能(官网地址):自动分页:PaginationInnerInterceptor多租户:TenantLineInnerInterceptor动态表名:DynamicTableNameInnerInterceptor乐观锁:OptimisticLockerInnerInterceptorsql性能规范:IllegalSQLInnerInterceptor防止全表更新与删除:BlockAttackInnerInterceptor
  本文使用到的是TenantLineInnerInterceptor。在我们的代码中,使用了TenantLineInnerInterceptor类的有参构造方法。入参为TenantLineHandler对象。这是比较重要的对象,比如:某一些表不需要拼接多租户条件、多租户的字段名是什么。都是在这个对象中规定。publicinterfaceTenantLineHandler{获得租户ID值本文写死了111ExpressiongetTenantId();数据库字段默认为tenantiddefaultStringgetTenantIdColumn(){returntenantid;}需要忽略拼接条件的表名方法默认返回false表示所有表都需要拼多租户条件defaultbooleanignoreTable(StringtableName){returnfalse;}这个方法在之前版本是没有的!已给出租户列的insert不再拼接条件。使用用户给出的值。针对比较特殊的场景,比如:异步添加时,获取不到登录人的租户ID,则给默认租户IDdefaultbooleanignoreInsert(ListColumncolumns,StringtenantIdColumn){returncolumns。stream()。map(Column::getColumnName)。anyMatch((i){returni。equalsIgnoreCase(tenantIdColumn);});}}复制代码配置文件server:port:1998spring:datasource:url:jdbc:mysql:127。0。0。1:3306test?useSSLfalseuseUnicodetruecharacterEncodingutf8username:rootpassword:xxxdriverclassname:com。mysql。jdbc。Drivermybatisplus:configuration:logimpl:org。apache。ibatis。logging。stdout。StdOutImpl复制代码测试SpringBootTestpublicclassMybatisPlusApplicationTests{AutowiredTenantMappertenantMapper;TestpublicvoidtestSelect(){ListTestTenanttestTenantstenantMapper。selectList(null);testTenants。forEach(System。out::println);}}复制代码
  关注控制台打印的sql语句,在where语句后面拼接了testtenant。tenantid1111的条件。这说明我们的租户隔离达到效果,并且很轻松容易的实现了。测试增修删语句
  那我们再来看看其他语句!TestpublicvoidtestOther(){System。out。println(测试新增);TestTenanttestTenantnewTestTenant();testTenant。setAccount(hhhh);testTenant。setEmail(100093);tenantMapper。insert(testTenant);System。out。println(测试修改);testTenant。setEmail(164。com);tenantMapper。updateById(testTenant);System。out。println(测试删除);tenantMapper。deleteById(testTenant。getId());}复制代码测试新增测试新增Preparing:INSERTINTOtesttenant(account,email,tenantid)VALUES(?,?,1111)Parameters:hhhh(String),100093(String)Updates:1复制代码测试修改测试修改Preparing:UPDATEtesttenantSETaccount?,email?WHEREtesttenant。tenantid1111ANDid?Parameters:hhhh(String),164。com(String),4(Integer)Updates:1复制代码测试删除测试删除Preparing:DELETEFROMtesttenantWHEREtesttenant。tenantid1111ANDid?Parameters:4(Integer)Updates:1复制代码
  可以得知,当配置了TenantLineInnerInterceptor插件后,我们的CRURSQL都拼接了我们所指定的字段作为where条件。特殊处理
  在实际的开发中,肯定不会如此的一帆风顺。肯定会有一些比较特殊的逻辑。某表不需要拼接租户条件
  总有一些表是比较特殊的。表中压根就没租户id字段,那这怎么处理呢?我们只需要重写TenantLineHandler类中的ignoreTable方法即可。需要忽略拼接多租户条件的表名Value({{mybatisplus。configuration。ignoretenanttables:}。split(,)})privateListStringignoreTenantTables;该default方法默认返回false表示所有表都需要拼多租户条件如果有部分sql不需要加上租户ID条件可以使用InterceptorIgnore(tenantLinetrue)标注在Mapper接口的方法上而SqlParser(filtertrue)在mybatisplus3。4版本中标记为过时OverridepublicbooleanignoreTable(StringtableName){returnignoreTenantTables。stream()。anyMatch((e)e。equalsIgnoreCase(tableName));}复制代码
  在配置文件中将需要忽略的表名进行配置。mybatisplus:configuration:ignoretenanttables:testtenant复制代码测试TestpublicvoidtestSelect(){ListTestTenanttestTenantstenantMapper。selectList(null);testTenants。forEach(System。out::println);}复制代码
  可以看到这一次的查询语句中并没有拼接多租户条件。某一条sql不需要拼接
  对于一些拥有租户id字段的表,在某一些场景中,比如:我想获得表中所有数据,不想让它拼接条件。那应该怎么做?注意:这种都是自己自定义sql语句。
  我们只需要在自定义的方法上标注一个注解InterceptorIgnore。这是官方提供的。
  该注解作用于xxMapper。java方法之上,各属性代表对应的插件,各属性不给值则默认为false,设置为true表示忽略拦截。自定义sqlSelect(SELECTid,account,email,tenantidFROMtesttenant)InterceptorIgnore(tenantLinetrue)ListTestTenantlistAll();复制代码测试TestpublicvoidlistAll(){ListTestTenanttestTenantstenantMapper。listAll();testTenants。forEach(System。out::println);}复制代码
  额外知识点
  TenantLineHandler类中,还有一个方法没有介绍,那就是ignoreInsert方法。这个方法的作用就是如果你在进行insert时,我们手动给了租户id字段,则框架不再自动拼接。我们来看看效果吧!TestpublicvoidtestInsert(){System。out。println(测试新增);TestTenanttestTenantnewTestTenant();testTenant。setAccount(hhhh);testTenant。setEmail(100093);testTenant。setTenantId(11232323);tenantMapper。insert(testTenant);}复制代码
  可以看到sql中tenantid的值,取的是我们指定的值。我们看看源码是怎么处理的!逻辑在processInsert方法中。
  如果需要插入的列中,包含知道的租户列,则不进行多租户处理。
  如果还想对update、deletesql也进行这种特殊的处理,只需要重写对应的方法processUpdate、processDelete。

大爆冷!斯诺克世界冠军25输球,6人晋级16强,奥沙利文一日北京时间2023年3月8日,斯诺克6红球世锦赛结束第2日争夺,世界冠军马克威廉姆斯完成首秀,结果以25不敌乔佩里,爆出大冷门。前两个比赛日结束,6位球员率先晋级16强,包括中国……17连胜!就在今天,保罗创造了一项疯狂纪录,成为NBA历史第北京时间12月1日,NBA常规赛继续进行,菲尼克斯太阳队坐镇主场迎战金州勇士队。两支球队是联盟的领头羊,近期的状态都好得不像话。勇士队处于7连胜当中,太阳队更狠,一波16连胜简……查理史宇宙中的物质?(宇宙五)这是一个物质的世界。我们能感知面前固态的,桌子,椅子。液态的水。气态的空气和风。以及看到日升月落,这种很平常的天体现象,这些实实在在的事物,组成了我们日常生活所熟悉的物质世界。……努比亚Z40SPro预热搭载物理滑动键,支持3DLut自定义7月13日,努比亚手机官方预热努比亚Z40SPro,表示这款手机会配备物理滑动键。从预热海报看,努比亚Z40SPro的物理滑动键位于摄像头模组附近,这颗按键为闪拍特别定制……FindX5Pro夜景视频表现如何?对比iPhone13Pr提到iPhone,相信大多数人的印象都是iOS系统好用、拍视频很强等。确实,以往iPhone在录制视频的画质、防抖效果等方面一直领先于友商,因此被许多用户称其为手机录像天花板。……2500元左右的手机选哪款好?这3款性价比高,首选红米K50自去年以来,2500元左右的中端机成了市场上的香饽饽,因为大家开始清醒消费了,不再盲目追求最新版旗舰机,而是开始选择一款综合性能可以满足自己使用的就够了,所以市场开始下沉到中端……东滩社区观鸟生活节,畅想鸟进人不退的生态友好社区12月17日,崇明岛迎来入冬以来气温最低的一天。一大早,在靠近东滩鸟类国家级自然保护区的中兴镇富圩村,往日的宁静被阵阵喧嚣打破,崇明东滩首届滨海社区观鸟生活节在这里启动。活动现……日本新公布6大长寿行为,原来长寿很简单?长寿一直是人类在研究的课题。但长寿也不是一蹴而就的。长寿也需要多种因素长期的积累。日本最近宣布了六项新的长寿行为,其中体育项目排在最后。你知道第一个是什么吗?1、养成午睡……天然叶酸排行前3名,中老年多吃,降低三高,降低患癌概率叶酸想必大家都不陌生,生过宝宝的人都知道,叶酸是孕妇和备孕女性的专属,孕妇在怀孕前三个月,以及怀孕后期都需要为身体补充叶酸来预防胎儿畸形。对于老年人来说,叶酸更是必不可少……男子旅行后突然视力下降!医生前往高原地区游玩需警惕暑期正是旅游旺季感觉朋友圈里一半在新疆海南,另一半在广袤的西部,尤其是西藏旅游。但很多人不知道的是前往这些高原地区游玩:需当心你的眼睛!半个月前,福建35岁的潘先生趁着假……四川首富之女,接棒千亿新能源龙头澎湃新闻记者杨漾新能源商界的父子兵父女兵并肩上阵并不罕见,但最新一例格外引人注目:四川首富刘汉元之女、34岁的刘舒琪正式接棒,成为市值超1700亿元的通威股份(60043……昨夜今晨全球大公司动态华为和苹果将同期发布新款旗舰手机。软银称出售阿里股份为展示财务状况稳健。家乐福将冻结100种产品价格帮助法国人应对通膨。新加坡写字楼租金回升至疫情前水平。绿地、康师傅、科大讯飞……
爆火的聊天机器人你知道多少?2022年11月底,美国一家人工智能公司上线了一款聊天机器人程序(ChatGPT),掀起了一场技术革命,引爆了新一轮科技巨头军备竞赛。聊天机器人与搜索引擎不同我要写……20!日本队挑落世界第14强队,妖星队被打回原形,日媒狂赞北京时间9月23日,麒麟杯,日本队对阵美国队。最终,日本队20击败对手,赢得了一场颇具含金量的比赛。日本队目前世界排名第24位,在亚洲排名第二。美国队世界排名高居第14位……村田制作所对中国工厂最大规模投资,瞄准EV日本村田制作所将在中国江苏省的工厂新建生产厂房。投资约450亿日元,增产占据全球份额首位的主力电子零部件积层陶瓷电容器(MLCC)的零部件。作为单次设备投资创出村田制作所的历史……单场19分5记三分!戈登点出火箭胜因,暗赞小波特,11次助攻火箭队战胜东部弱旅魔术队,目前战绩也变成了2胜9负,不但把尴尬的6连败直接终结,更是让球员们有了赢球的信心。本场比赛火箭队的大部分球员状态回暖,尤其是三分球,火箭全队出手48记……CBA全明星首发第一周投票易建联南区票王曾凡博北区票王直播吧2月10日讯2023CBA全明星赛首发球员票选第一周球迷投票公布:南区前场排名前五的球员为:易建联(357,416票)、周鹏(263,365票)、王哲林(160,8……腾讯QQiOS版8。8。85发布,体积进一步下降IT之家3月31日消息,今日,腾讯QQiOS版迎来8。8。85版本更新。在上一版本缩小近20MB的基础上,QQiOS版8。8。85版本体积进一步减小,从890。6MB(8……中国芯片制造的现状和未来挑战与机遇,多久能追上西方国家?随着全球经济和技术的发展,芯片作为现代产业中最关键的组成部分之一,对于各个国家的经济、安全和军事实力都具有重要意义。然而,中国芯片制造业在与西方国家的竞争中仍面临许多问题和挑战……晚上不好好刷牙,牙齿可是要掉光的随着口腔健康知识的普及,现在很多街坊都知道一天起码要刷两次牙。但有些人受习惯所限,只记得早起刷牙,晚上睡前随缘刷牙,记得就刷,不记得就算。毕竟早起之后要洗漱吃早餐,刷牙成了一个……华为Mate50终于确认了!花粉期待吗?华为Mate50终于确认了!花粉期待吗?01大势从2018年开始,华为就遭到了美方的打压,这也导致了华为的正常发展中断,直到现在十分的尴尬。因为华为的5G,华……最帅国足婚外情被曝光疑似穿国足训练服约会,花美女的钱买海参头条创作挑战赛北京时间1月20日,一位女子在网络曝光国足球员欺骗感情的一幕,吴兴涵用自己的小名和该女子交往,且不承认自己早已结婚。该女子表示,自己曝光这件事,是要提醒其他……继京东唯品会之后,阿里也布局自营了,但有一点却大为不同谁也没有想到,阿里如今竟然开始青睐重资产重运营的自营模式,不断发力拥抱自营。2022没开始多久,阿里的B2C零售事业群就围绕大品牌开设天猫自营旗舰店,手机天猫APP也改版……真正拖垮你的,是内耗思维有时候,所谓的人生困境,不过是你胡思乱想,自我设置的枷锁。患得患失,会举步难行;过分在意,注定心力交瘁。这种内耗的感觉就如同总有两个小人在内心打架,每天什么也没做,……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网