「MyBatis-Plus」实现多租户功能

一、引言

多租户是一种软件架构技术,在多用户的环境下,共有同一套系统,并且要注意数据之间的隔离性。

举个实际例子:小编曾经开发过一套H5程序,这套程序应用在不同医院的APP上,当医院患者下载医院APP,并且进入相对应的H5页面,APP则会把用户相关数据传输到小编这里。在传输的时候需要带上医院标识(租户ID),以便小编将数据进行隔离。

当不同的租户使用同一套程序,这里就需要考虑一个数据隔离的情况。

数据隔离有三种方案:

1、独立数据库:简单来说就是一个租户使用一个数据库,这种数据隔离级别最高,安全性最好,但是提高成本。

2、共享数据库、隔离数据架构:多租户使用同一个数据裤,但是每个租户对应一个Schema(数据库user)。

3、共享数据库、共享数据架构:使用同一个数据库,同一个Schema,但是在表中增加了租户ID的字段,这种共享数据程度最高,隔离级别最低。

二、具体实现

这里采用方案三,即共享数据库,共享数据架构,因为这种方案服务器成本最低,但是提高了开发成本。

所以MP就提供了一种多租户的解决方案,实现方式是基于分页插件进行实现的,具体实现代码如下:

/** * @Auther: IT贱男 * @Date: 2019/6/12 15:06 * @Description: MybatisPlus配置类 */@Configurationpublic class MyBatisPlusConfig {    /**     * 分页插件     *     * @return     */    @Bean    public PaginationInterceptor paginationInterceptor() {        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();        // 创建SQL解析器集合        List<ISqlParser> sqlParserList = new ArrayList<>();        // 创建租户SQL解析器        TenantSqlParser tenantSqlParser = new TenantSqlParser();        // 设置租户处理器        tenantSqlParser.setTenantHandler(new TenantHandler() {            @Override            public Expression getTenantId() {                // 设置当前租户ID,实际情况你可以从cookie、或者缓存中拿都行                return new StringValue("jiannan");            }            @Override            public String getTenantIdColumn() {                // 对应数据库租户ID的列名                return "tenant_id";            }            @Override            public boolean doTableFilter(String tableName) {                // 是否需要需要过滤某一张表              /*  List<String> tableNameList = Arrays.asList("sys_user");                if (tableNameList.contains(tableName)){                    return true;                }*/                return false;            }        });        sqlParserList.add(tenantSqlParser);        paginationInterceptor.setSqlParserList(sqlParserList);        return paginationInterceptor;    }}

配置好之后,不管是查询、新增、修改删除方法,MP都会自动加上租户ID的标识,测试如下:

@Test    public void select(){        List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getAge, 18));        users.forEach(System.out::println);    }
DEBUG==>  Preparing: SELECT id, login_name, name, password, email, salt, sex, age, phone, user_type, status, organization_id, create_time, update_time, version, tenant_id FROM sys_user WHERE sys_user.tenant_id = 'jiannan' AND is_delete = '0' AND age = ? DEBUG==> Parameters: 18(Integer)DEBUG<==      Total: 0

三、特定SQL过滤

如果在程序中,有部分SQL不需要加上租户ID的表示,需要过滤特定的sql,可以通过如下两种方式:

方式一:在配置分页插件中加上配置ISqlParserFilter解析器,如果配置SQL很多,比较麻烦,不建议。

paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {            @Override            public boolean doFilter(MetaObject metaObject) {                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);                // 对应Mapper、dao中的方法                if("com.example.demo.mapper.UserMapper.selectList".equals(ms.getId())){                    return true;                }                return false;            }        });

方式二:通过租户注解的形式,目前只能作用于Mapper的方法上。

/** * <p> * 用户 Mapper 接口 * </p> * * @author IT贱男 * @since 2019-06-14 */public interface UserMapper extends BaseMapper<User> {    /**     * 自定Wrapper修改     *     * @param userWrapper 条件构造器     * @param user        修改的对象参数     * @return     */    @SqlParser(filter = true)    int updateByMyWrapper(@Param(Constants.WRAPPER) Wrapper<User> userWrapper, @Param("user") User user);}
# 开启 SQL 解析缓存注解生效,如果你的MP版本在3.1.1及以上则不需要配置mybatis-plus:  global-config:    sql-parser-cache: true
作者:IT贱男来源:https://blog.csdn.net/weixin_38111957/article/details/101161660版权申明:内容来源网络,仅供分享学习,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
本文链接:https://www.dzdvip.com/36851.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年8月3日 22:46
下一篇 2022年8月3日 22:51

相关推荐

  • 沉香如屑好看吗(沉香如屑怎么样好看吗)

    “很好看的。 《沉香如屑》以中国式想象中的神、仙、人、妖、魔、冥“六界”作为故事发展的起点,在变故洗礼、善恶之战中讲述个体的成长,打造唯美仙侠意境,剧中既有中国传统美学的典雅和谐,也有仙侠剧的侠心义胆。 在人物设计上,从身负重任的六界帝君到仗剑凛然的捉妖天师,从不谙世事的活泼少女到日行一善的小花精,该剧并没有打造具有完美人格的“全能式”英雄,而是在宏大的故事背景中,男、女主胸怀众生与天地,在风起云涌中坚守仁义道德。 这几年的古偶剧,质量参差不齐,远远不能和前几年相提并论。 能够达到6分以上的,都算是“能看”的了。 比如杨紫和成毅出演的这一部《沉香如屑》,豆瓣开分了。 仅有5.6分,不及格。 而打一星的观众们,达到了21.9%,超过了五分之一。 对比一下,杨紫4年前,口碑较好的一部古装剧《香蜜沉沉烬如霜》的7.8分。 这个分数算是跌穿了口碑底线了。 《沉香如屑》这部剧的豆瓣评价,可以说是一言难尽。 打五星的网友有16%,而打一星的,却达到了21%。 有一部分网友觉得好,是因为这是一部“玛丽苏小甜汤”。 纯粹觉得平时可以“解解压”。 而也有网友们觉得不好,因为杨紫这部剧“同质化太严重了”。 再加上男主角演技比较尴尬,所以自己没有办法直视呢。 其实,这两位高赞网友,把这部剧的优缺点都说清道明了。 算是不错的评论,也得到了很多观众们的赞同。 其实,最早的国剧古偶,还是要追溯到20世纪90年代了。 在这一段时间内,从《还珠格格》到《上错花轿嫁对郎》,从《仙剑奇侠传》到《步步惊心》。 再到这几年的《御赐小仵作》《香蜜》,古偶剧占据的市场是很大的。 虽然有的时候,观众们也会抱怨有的古偶剧矫揉造作,不切实际,脱离了生活常识。 但是总的来说,古偶剧给很多想要逃离现实,抖落包袱的观众们很多的空间。 所以,很多的古偶剧,一边被骂,一边继续拍摄。 就像第一个网友说的,这部电视剧比较“甜”,可以释放压力。 《沉香如屑》,改编自苏寞的同名小说,讲述了男女主角携手守卫人间正道的故事。 有中国传统美学的典雅,也有仙侠剧的侠胆义胆。 因为兼具着两大顶流的加盟,该剧在没有播出之前,就已经收获了上百万的预约量,热度也是遥遥领先。 可谓是未播先火。 好的古偶剧,对于男女主角的颜值和演技,要求也是很高的。 杨紫作为一个很有人气的90后演员,曾经有过很多的经典作品。 从童年时期的《家有儿女》《孝庄秘史》开始,…

    2022年9月4日
    76
  • 长江三峡指的是哪三峡(游长江三峡需要多长时间以及多少钱)

    “长江三峡指的是瞿塘峡、巫峡和西陵峡。长江三峡西起重庆市奉节县白帝城,东至湖北宜昌市南津关,全长193千米,沿途两岸奇峰陡立、峭壁对峙。” 最近有粉丝给我留言,问长江三峡指的是哪三峡,分别在哪里,有多长?其实很多人都听过长江三峡,但却不知道长江三峡的详细情况,下面跟着小编一起来看看何为长江三峡。 长江三峡指的是哪三峡? 长江三峡由瞿塘峡,巫峡,西陵峡组成,总称为长江三峡。自西向东依次为瞿塘峡,巫峡,西陵峡,全长水路共计193公里。 长江三峡分别在哪里,有多长? 长江三峡第一峡(瞿塘峡),位于重庆市奉节县白帝镇。西起奉节县白帝山,东至巫山县大溪乡,全长8公里,也是长江三峡最短的一个,瞿塘峡以“雄伟壮观”著称。 长江三峡第二峡(巫峡),位于重庆巫山县。从城东大宁河起,至巴东县官渡口,全长46公里,巫峡绮丽幽深,以俊秀著称天下。有“大峡”之称。 长江三峡第三峡(西陵峡),位于湖北省秭归县。西起秭归的香溪口,东止宜昌南津关。全长66公里,西陵峡也是长江三峡最长的一个,滩多水急,以宜昌市的西陵山而得名。 从以上可以看出,瞿塘峡,巫峡属于重庆市,西陵峡属于湖北宜昌市,也就是下面的传统三峡游的两种航线。 传统的长江三峡航线分为下水航线(重庆至宜昌)和上水航线(宜昌到重庆)。乘客不管选择下水还是上水,再也不能一次性看不全长江三峡,为什么这么说呢? 因为自从2018年起,三峡游轮不能优先过三峡大坝五级船闸,所以乘客都需在茅坪港下船,上岸游览三峡大坝,车送至宜昌市区散团,长江三峡第三峡——西陵峡游船不经过了。目前乘客想看长江三峡的第三峡,只有单独参加宜昌市的两坝(葛洲坝,三峡大坝)一峡(西陵峡)行程。 游长江三峡需要多长时间以及多少钱? 下水航线:分为2天,3天,4天时间,分别是奉节登船,万州登船,重庆朝天门码头登船; 奉节登船2天1晚:每人的价格600-1000元; 万州登船3天2晚:每人的价格500-1200元; 重庆登船4天3晚:每人的价格1200-5000元; 上水航线:宜昌到重庆5天4晚,第一天宜昌市区坐车到茅坪港登船,价格1200-5000元左右; 今天的三峡游轮资讯就介绍到这里,关注我不走丢,喜欢的朋友留下你们的足迹,点赞,评论,收藏,转发都可以。

    2022年6月11日
    12
  • 苹果14系列已定档,pro系列增加紫晶邅色和青色果粉们拭目以待吧

    苹果14将于今年的2022苹果秋季发布会上正式发布,此次苹果14系列共有四款机型,分别是iPhone14、iPhone14Max、iPhone14pro和iPhone14pro Max,取消销量不好的mini系列。 屏幕方面,iPhone14系列仍旧延续之前的刘海屏设计,而pro系列采用全新的“挖孔屏”设计,大家期盼已久的“无刘海设计”终于要来了,14系列依旧无缘高刷,pro系列也是延续iPhone13pro Max的120Hz刷新率。 全新的刘海屏也带来了全新一代Face ID人脸识别系统和更好的前摄系统,据爆料称,全新的前‬置镜头,加入‬自动对焦功能,但是‬造就假‬将会是‬以前‬的‬三倍‬高‬,所以今年的iPhone的Pro系列整体价格可能会向上涨。 性能方面,苹果14系列继续采用高频版A15处理器,而14pro系列将采用全新一代A16芯片,芯片这个东西相差一年的话,目前‬iPhone的‬性能‬已经‬过剩‬,使用体验其实相差不会太大。 配色方面,延续苹果13系列配色与14pro首发配色共八种,全新的紫晶邅配色为14pro的首发特别配色,据说还有青色。 影像方面,14系列还将延续13系列的模组发布,而14pro系列将搭载全新的4800万主摄,并且支持8K HDR视频频录制 系统方面,全新的ios16系统加持,14系列也将是首次支持息屏显示的iPhone。

    2022年6月3日
    83
  • 做SEM吸引客户有哪些关键点?

    如今,企业在追求品牌知名度的同时,也越来越注重转化效果。并且在网络营销方面,快速转化见效的 SEM深受企业喜爱。当前,网络营销渠道趋于多元化, SEM推广是企业撒钱最多、投放回报率也是最高的推广方式之一。 SEM竞价推广有很多好处,但如果没有正确的实施策略和技巧,那它就等同于烧钱。那么如何做才能通过 SEM竞标获得更精确的客户?     1精准关键词 SEM推广提升曝光和点击的最重要环节就是精准关键词。精准关键词需要专业的推广人员理解并提取用户真正喜欢的关键词,将这一类关键词包含在SEM投放策略。精确关键词不仅能提高目前的转化效果,而且还能有效地节省本钱,从而提高企业投资回报率 ROI。一般情况下,关键词可以分为品牌词>竞品词>通用词>产品词>活动词。在思考转化效果时,首先要选择精准的关键词,而那些过于宽泛的关键词可以舍弃,同时要着重选出的20%的精准关键词,以便及时调整推广策略。   2优化创意 一般从以下三个维度来考虑创意优化。A、强调产品的特性,使之与用户构成共同利益点。B、加大活动促销优惠力度,这样才能增加用户兴奋消费的乐趣。C、在创作上多运用号召性词汇,引导用户,从而运送用户去点击。。策划过程中,切记不要过分夸大产品,当用户被创意吸收后,点击进入网站后才发现与事实不符,持久如此不会只形成本钱的进步,还会使企业荣誉下降,得失相称。另外,同一单元,创意不能超过3条,太多创意会导致数据测试不准确,无法得出最佳方案。   3着陆页优化 投放SEM最重要的三个环节是:曝光、点击和转化。而最重要的转化环节是,所有的产品特色、亮点承载都落在着陆页上。因此,对着陆页进行优化非常重要。创建网站前应做好市场调研,再根据过去的经验,把用户的注意力集中在企业的着陆页上。关键在于深入展现用户的痒点点、痛点,这样才能将竞争者区别开来,并因这些细节问题的展现击败对手。4着陆页优化方向   A、SEM投放的登陆页面必须包含导航,有时候分着陆页也许不能满足用户的需要,而导航的作用可以引导用户阅读其他需要了解的信息。B、着陆页常要求转换到注册环节,注册过程中一定要合理设置注册栏选项位置。同时注册页面可以增加用户的利益点,提高注册兴趣从而提高注册率。C、登陆页注重使用在线咨询工具,例如:在线客服咨询,在线电话咨询,在线留言等工具。 客户需求不断地在变化,未来 SEM将是…

    2021年8月26日
    15
  • 复姓有哪些(复姓是什么意思)

    “我国传统百家姓中的复兴共有81个,具体包括欧阳、太史、端木、上官、南宫、独孤、东方、司马、夏侯、诸葛、尉迟等,其中欧阳是汉族人口用的最多的复姓,太史姓目前在山东等地仍然有分布,端木姓来源于东周时期。” 若有诗词藏于心,岁月从不败美人 后台回复“日历”可获取诗词日历和免费图书 宋编《百家姓》共收单姓408个, 复姓32个,共计440个姓氏; 现通行本《百家姓》在宋编基础上, 又增收了单姓36个,复姓28个,总计504个姓氏; 虽然这504个姓氏只占至今 仍在使用的三千多个姓氏的1/6, 但是涵盖了我国人口总数的90%。 今天,诗词君介绍十八个复姓, 究其渊源,探其传承。 蜀汉名臣:诸葛亮(影视资料) zhū gě 诸 葛 姓氏起源:大部分诸葛姓由葛姓衍化而来,商朝时,伯益的后裔葛伯,被封为诸侯,灭亡后,后世有一支迁居诸城(今山东省诸城),后迁至阳都(今山东省沂水县),当地已有葛姓,故后来的葛姓取“诸葛”二字为他们的姓氏。 主要名人:诸葛亮,诸葛瑾,诸葛恪等。 司马懿(影视资料) sī mǎ 司 马 姓氏起源:司马是一个官职,西周时始调。后来,程伯休父官至司马,周宣王允许他以官职为姓,于是就有了司马氏。其它国家如春秋宋国、晋国等都有司马,以司马为姓。 分布:河南省的洛阳市、偃师市、温县,陕西省的韩城县,台湾省等地均有司马氏族人分布。 主要名人:司马迁,司马相如,司马懿,司马昭,司马炎等。 唐代才女:上官婉儿(影视资料) shàng guān 上 官 姓氏起源:春秋时,楚怀王封他的小儿子兰为上官邑大夫,子兰的后代子孙遂以邑名为姓,称上官氏。 分布:秦灭六国后,迁徙楚国公族大姓于关中,上官氏则被被迁往陇西上圭。上圭,也就是今天的甘肃天水。唐末纷扰,上官氏的先人南迁至今福建的南平市光泽县。 主要名人:上官仪,上官婉儿,上官桀等。 xī mén 西 门 姓氏起源:1.出自姬姓,以祖上居地为氏。2.出自姜姓,亦以祖上居地为氏。3.出自战国时西门豹之后,以祖名为氏。 分布地区:如今在北京、上海、山东等地,还有极少数量的西门氏族人零星分布。 主要名人:西门豹。 北周武帝宇文邕(影视资料) yǔ wén 宇 文 姓氏起源:一、宇文姓起源于辽东,为南单于之后。魏晋时,北方鲜卑族有宇文氏部落。东晋时,宇文氏进据中原,号称宇文国,以宇文为姓,称宇文氏。二、源于嬴姓,出自南北朝时期北周政权大…

    2022年3月5日
    52
  • 跨境电商主要是干什么?靠谱吗?还能持续多久?

    亚马逊平台和国内电商平台的区别 亚马逊平台和国内电商平台的区别如下。 (1)平台的性质不同。 亚马逊是一家全球网络零售商,更是一家大数据公司,也是一家云计算、云解决方案公司等,国内电商平台只是单纯的电商购物平台。 (2)面对的消费市场不同。 对中国卖家来说,亚马逊是一个出口跨境电商平台,通俗地讲,就是将中国制造的产品销往海外市场,能够与海外终端消费者直接接触;而国内电商平台面对的是国内消费市场。 (3)店铺的概念不同。 亚马逊平台强调以产品为中心,没有店铺的概念,这是重点。 很多美国本土大卖家只有几个产品,甚至一个产品一年能做出几百万美元的营业额,这跟国内淘宝卖家每天上架几十个、几百个产品区别非常大,也是新卖家刚接触这个平台时非常不适应的地方。 买家在亚马逊上买东西只会看卖家的品牌,不会记得卖家的店铺名称,没有逛店铺的概念。 国内电商平台(如人们最熟悉的淘宝)是先免费开店铺,然后装修店铺,再上架自己的产品,最后开始销售。 如何注册亚马逊账户 在亚马逊上经营必须注册账户,账户分为自注册账户和招商经理的全球开店账户两种。 1.自注册账户 自注册是以个人身份在亚马逊平台上注册卖家账户。如图 2.1 所示,点击亚马逊网站(www.amazon.com)的 Sell on Amazon(在亚马逊上销售),出现如图 2.2 所示的页面,点击 Start selling(开始销售)按钮,按照要求填写好所需要的资料。 图 2.1 图 2.2 亚马逊账户具有唯一性,即一个营业执照、一个网络 IP、一个身份证号只能注册一次账户。 在注册时,一些微小的错误都会导致注册失败。在第二次注册时就需要全新的营业执照、网络 IP、身份证号等。 所以,不建议新卖家自行注册账户。 2.招商经理的全球开店账户 亚马逊在中国有招商团队,新卖家只需要联系招商经理,提交一套全新的资料(包括营业执照一份、双币信用卡一张、法人身份证扫描件和全新的电子邮箱),在得到招商经理提供的注册链接后按照要求注册就可以。 注意事项如下。 (1)营业执照类型最好是贸易公司或者电子商务公司,营业执照的经营范围要有经营进出口业务等。 在注册公司的时候,建议注册个人独资公司,这样方便给亚马逊提供股东资料,如果有多个股东则需要提供多份资料。 (2)只需要双币信用卡,平台只接受 Master 和 Visa 的信用卡。 (3)在注册账户时,…

    2021年6月10日
    10