从架构师角度谈谈mybatis-plus可能存在的问题
存在这么一个情况:对于缺营养的人来说,医生更倾向于建议他选择纯牛奶,而不是有机奶(因其有添加剂)。然而,大部分人却更加倾向于选择有机奶,
因其口感不错,因此,对于选择纯牛奶还是有机奶,这是个博弈问题。
本篇文章,主要从架构师角度谈谈为什么建议选择mybatis(纯牛奶),而不建议选择mybatis-plus(有机奶),大家有任何想法,欢迎在评论区交流。
1 关于dao层技术选型
在JAVA领域,可选择的ORM框架还是比较多的,如Spring JDBC,JPA,Hibernate,Mybatis,Mybatis-plus等,其中,mybatis可以算得上是领导者,具有极强的领导作用。
2 深入分析mybatis plus插件原理
2.1 资料
https://mp.baomidou.com/guide/
https://github.com/baomidou/mybatis-plus
2.2 mybatis 源码架构解析
2.3 mybatis-plus 架构与源码
3 mybatis plus 存在的问题
关于mybatis-plus的优点,这里就不论述了,官网说得很详细,详细参考官网:
https://jiansutech.yuque.com/staff-al4og8/drmyey/brma9c
3.1 增加学习成本
mybatis是公认的,被市场验证过的,程序员普遍认同的,java行业统一认同的ORM框架,但mybatis-plus并未经过市场的充分验证,且更谈不上程序员普遍认同
和java行业统一认同,如此,假设A,B,C,D,E,F公司,都用mybatis(因为是公认的,行业默认标准),而只有A,C公司用mybatis-plus,在这样情况下,A公司外聘
了B,D,E,F公司的技术人员,这些技术人员加入进来,需要学习mybatis-plus插件,增加了学习成本。
3.2 增加升级和维护成本
1.mybatis版本变化,mybatis-plus版本是否会相应变化?
2.对于mybatis-plus每个版本,是否充分经过市场验证和证明?若出现不能用或bug,怎么解决?
3.3 “百花齐放”现象
在Java开发领域,有这么一个默认共识:在考虑稳定性,可扩展性和生态性前提下,架构越简单,越单纯,越单一,越佳。举几个例子:
例子1:架构的干净与统一
你会更喜欢一个只有一种ORM还是有多种ORM的框架,除此之外,考虑一下新人入手框架的学习成本以及代码的维护成本。
例子2:开发人员的犹豫性
假设开发人员接手一个多种ORM组合的框架,那么他在开发需求时,他应该选择哪个ORM框架呢?
例子3:开发人员的排他性
假设一个只熟悉Hibernate的开发人员接手到一个混合ORM框架吗(暂且定为二混合,即hibernate和mybatis),当他在开发新需求时,会更倾向于选择hibernate(即使他
知道,在大多数场景下,mybatis性能优于hibernate性能),而不是mybatis,当你问他为什么不用mybatis时,他肯定会反驳几个让你无法回对的问题,如框架不是有hibernate
吗,照着copy不就ok了?我不熟悉mybatis,刚好框架也有hibernate,方便快捷?没人给我说尽量用mybatis呀,框架有说明么?......
例子4: 开发人员的自我证明与炫耀性
你看现在框架里有多种组合,我也搞一种,A说我封装了一个Json类,B说我封装了算法类,C说我封装了字符串类,D说公司有自己通用的类,E说你们这些都不行,你看
现在hutool(对该框架感兴趣,可参官方文档:https://www.hutool.cn/docs/#/)这么齐全,直接用就好。。。,如此,真是“百花齐放”,难以控制。
3.4 DB和架构师视角
根据mybatis-plus源码,随机抽取几个功能接口来分析:
1 T selectById(Serializable id);
1.基本性能视角:假设用户信息表有100个字段,100w条数据(其实,100w数据是远远不够的,一般有一定业务量的,都是千万级别),每次都SELECT * FROM user_info,结果会怎样?
2.dba或架构师优化视角:某天,系统很卡,问题反馈到DAB或架构师处,他们均不能直观的看到sql是怎么写的,也没有时间去研究源码,也没时间去反编译,那么他们如何去优化?
3.联合主键视角:某天,发现仅仅通过主键id不能解决性能问题,需要建立联合索引,此时,该如何解决?
4.表Join视角:从用户维度,我们能拆分成很多部分,如用户基本信息表(静态),用户信息表(动态),用户组表,用户资产表,用户权限表,用户部门表,
这些表如何进行join查询,该如何解决?表的水平垂直拆分,也是相同道理。
5.代码评审视角:代码评审最重要的是确定代码业务逻辑的准确性,其中包括两部分:(1)代码及代码逻辑 (2)SQL语句,而mybatis-plus将CRUD封装在框架内,
无法直接看到SQL,那么在评审SQL时,如何评审,更恐怖是的是,如果DBA参与评估的话,他看不到SQL,在他那里评估就过不了。
3.5 安全视角
以用户信息表为例,假设该表有100个字段,其中手机号,身份证,姓名,年龄,资产为其中字段,现在有个需求:需要开一个接口,统计年龄大于30,
资产100w以上的人id,姓名,手机号,会有什么样的问题?
问题一:将不需要的字段用户身份证,用户资产字段暴露在网络传输中,被第三方抓包工具抓取数据,用户安全信息存在隐患。
问题二:若进行DTO转换,是否存在转换成本,这里会有两个性能IO代价,代价一是从DB库捞取数据成本,成本二是DTO成本。
3.6 不利于架构发展
研究过mybatis-plus源码的同学知道,这个封装版框架是将mapper和service捆绑一起的,然而,在微服务架构,中台架构,尤其是DDD驱动设计中,
service和mapper并不是耦合的(否则会造成domain贫血),对DDD领域感兴趣的同学,可以去研究领域驱动设计《实现领域驱动设计 (美)弗农著》,提供DDD简要架构图:
从架构师角度谈谈mybatis-plus可能存在的问题的更多相关文章
- 【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题
"如何解决TCC中的悬挂问题"! 一个工作了4年的Java程序员,去京东面试,被问到这个问题. 大家好,我是Mic,一个工作了14年的Java程序员 这个问题面试官想考察什么方面的 ...
- 阿里Java架构师谈谈架构和如何成为一个Java架构师
架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...
- 从“思考”的角度来看如何成为一名优质的Java架构师
导读: 架构师应不应该写代码 为什么别人的系统总是那么烂 成为架构师最困难的门槛是什么? 如何更高效的学习? 1.架构师应不应该写代码 合格的程序员对于明确分配的任务会完成的很好,但是大部分情况下&q ...
- 谈谈.NET架构师面试及如何设计面试题
上星期:应老东家的要求,帮其面试.NET架构师. 于是:老东家进行了一星期的简历收集: 终于:在一堆简历里,精挑细选了四个: 约了:周末上午下午各两个. 面试者年龄:在30-35岁左右,差不多10年. ...
- 一位10年Java工作经验的架构师聊Java和工作经验
从事近十年的 JavaEE 应用开发工作,现任阿里巴巴公司系统架构师.对分布式服务架构与大数据技术有深入研究,具有丰富的 B/S 架构开发经验与项目实战经验,擅长敏捷开发模式.国内开源软件推动者之一, ...
- 转:一位10年Java工作经验的架构师聊Java和工作经验
黄勇( 博客),从事近十年的 JavaEE 应用开发工作,现任阿里巴巴公司系统架构师.对分布式服务架构与大数据技术有深入研究,具有丰富的 B/S 架构开发经验与项目实战经验,擅长敏捷开发模式.国内开源 ...
- 迅雷首席架构师刘智聪:微信小程序的架构与系统设计的几点观感
笔者注:本文来自于迅雷首席工程师刘智聪的个人分享,他毕业于南昌大学化学系,加入迅雷后设计开发了多款迅雷核心产品,凭借“大规模网络流媒体服务关键支撑技术”项目获得2015年国家科学技术进步奖二等奖,同时 ...
- 子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践
本文原文内容来自InfoQ的技术分享,本次有修订.勘误和加工,感谢原作者的分享. 1.前言 自从2018年8月20日子弹短信在锤子发布会露面之后(详见<老罗最新发布了“子弹短信”这款IM,主打熟 ...
- 阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?
工作3—5年后,程序员们的成长将迈入一个全新阶段.这既是程序员们的黄金时期同时又是最迷茫的时期,因为大家必须要要思考一下今后的职业方向. 3—5年程序员的发展和出路在哪里? 是继续做技术人,还是向管理 ...
随机推荐
- 使用TK框架中updateByPrimaryKey与updateByPrimaryKeySelective区别
int updateByPrimaryKey(T var1); int updateByPrimaryKeySelective(T var1); updateByPrimaryKeySelective ...
- 『政善治』Postman工具 — 7、Postman中保存请求(Collections集合)
目录 1.创建Collection 2.保存Request请求 3.查看保存的请求 4.Collection下还可以创建文件夹 5.补充:Postman中的变量 6.总结 1.创建Collection ...
- Truncate用法详解
前言: 当我们想要清空某张表时,往往会使用truncate语句.大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项.本篇文章主要介绍truncate语句的使用方法及注意事项. 1.t ...
- GCC链接时库顺序问题
GCC或G++在编译链接时,如果命令行中含有库,则要特别注意了.根据<C专家编程>5.3节中的提示,GCC在链接时对命令行时的处理顺序是从左到右.证据是GCC的MAN: -l librar ...
- 攻防世界 WriteUp
附:|>>>攻防世界-WEB-新手练习区<<<| WriteUp目录 01.|>>>baby_web<<<| 02.|>& ...
- Docker 的神秘世界
引言 上图就是 Docker 网站的首页,看了这简短的解释,相信你还是不知道它是何方神圣. 讲个故事 为了更好的理解 Docker 是什么,先来讲个故事: 我需要盖一个房子,于是我搬石头.砍木头.画图 ...
- PHP相关session的知识
由于http协议是一种无状态协议,所以没有办法在多个页面间保持一些信息.例如,用户的登录状态,不可能让用户每浏览一个页面登录一次.session就是为了解决一些需要在多页面间持久保持一种状态的机制.P ...
- 治理对象ing
计算治理项包括产出表未被读.暴力扫描.数据膨胀.数据倾斜.出错节点.导入为空和输入为空. 存储的治理项包括生命周期过长.未管理表.废弃表.空表.逻辑未管理表.逻辑废弃表.逻辑空表和黑盒物化空表.
- Python中if name == 'main':的作用
一个python文件通常有两种使用方法, 第一是作为脚本直接执行. 第二是 import 到其它的 python 脚 本中被调用(模块重用)执行. 因此 if name == 'main': 的作用就 ...
- SqlServer事务详解(事务隔离性和隔离级别详解)
概述 不少人对于事务的使用局限于begin transaction:开始事务.commit transaction:提交事务.rollback transaction:回滚事务的初步运用. 并且知道使 ...