从架构师角度谈谈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年程序员的发展和出路在哪里? 是继续做技术人,还是向管理 ...
随机推荐
- .NET 反射(Reflection)
这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节. ...
- 还不懂 redis 持久化?看看这个
Redis 是一个内存数据库,为了保证数据不丢失,必须把数据保存到磁盘,这就叫做持久化. Redis 有两种持久化方法: RDB 方式以及 AOF 方式 RDB 持久化 前言 RDB持久化把内存中的数 ...
- 合并两个yuv文件的C++代码
//将BasketballPass_416x240_50.yuv序列的前50帧和BlowingBubbles_416x240_50.yuv序列的前250帧合并成out.yuv //参数配置416 24 ...
- 并查集板子+kruskal
最近在学最小生成树得时候又用到了并查集,一起来整理一下 1.并查集 并查集就是字面意思,将两个单独得集合合并成一个大的集合. 并查集关键在于两个操作:合并和查找 先要完成查找操作(合并操作在查找的基础 ...
- Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题
Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题 Debian9.4系统不能再VIM打开文件界面不能使用右键复制粘贴 root@debian:~# vim /usr/sh ...
- Mysql体系结构管理
1.客户端与服务端模型 1)数据是一个典型的C/S结构的服务 1.mysql自带的客户端工具 mysql mysqladmin mysqldump 3.mysql是一个二进制程序,后台守护进程 单进程 ...
- 使用 dd 命令进行硬盘 I/O 性能检测
使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30 评论: 1 收藏: 6 如何使用dd命令测 ...
- Maven知识点一览
Maven 介绍和搭建 介绍 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告,和文档的软件项目管理工具. 环境搭建 网址:https://maven.apache ...
- KVM虚拟化存储管理(4)
一.KVM存储虚拟化介绍 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的. Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型: Vol ...
- 使用Apache Pulsar + Hudi构建Lakehouse方案了解下?
1. 动机 Lakehouse最早由Databricks公司提出,其可作为低成本.直接访问云存储并提供传统DBMS管系统性能和ACID事务.版本.审计.索引.缓存.查询优化的数据管理系统,Lakeho ...