为啥国人喜欢Mybatis,而老外偏心 Hibernate/JPA 呢?

这是一篇很不错的文章,长见识,文章有点长,你们能够慢慢读。会有所收获的。 java

关于SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触仍是有一些,因而就有了今天这篇文。 程序员

声明:面试

本文不会下关于 Mybatis 和 JPA 两个持久层框架哪一个更好这样的结论。只是摆事实,讲道理,因此,请各位看官勿喷。spring

1、事件原由

关于 Mybatis 和 JPA 孰优孰劣的问题,争论已经不少年了。一直也没有结论,毕竟每一个人的喜爱和习惯是大不相同的。sql

我也看过知乎上一些问答,各有各的理由,感受都挺有道理。若是让我不带感情色彩地去分辨,其实我也是懵的,由于真的是公说公有理婆说婆有理。数据库

而在国内,不得不认可,用 Mybatis 的公司确实是要比用 JPA 的多,可是在 2015 年之前,用 Hibernate 的公司确实也是不少的。编程

为何在国内,会有这样的现象发生?而在国外,老外会一如既往地使用 JPA 呢?咱们来分析分析。后端

2、目前生态

在最近(2018)的 JVM 生态报告中(https://snyk.io/blog/jvm-ecos...),Mybatis是使用率是很低的。能够看图:缓存

能够看出,Mybatis 的占比只有可怜的 6%,你们看到这个统计结果应该会很吃惊,你会以为,不对啊,我公司以及我不少朋友都在用 Mybatis 啊,好像没据说过有人用 JPA 的,这个统计结果是错的吧?微信

再从下面这个对比来看,MyBatis 的关注主要集中在中日韩。知道日韩为啥也高吗,猜中有奖哦,哈哈!

首先,必须指出,对于青年程序员,其实都会质疑这个图的可信度。

中老年程序员都在感叹国外其实更注重开发效率和面向对象的分析和设计。但我能够很是负责任地告诉你,这图是真的。那么,形成这种现象的缘由是?

3、国人喜欢 Mybatis 的缘由

总结起来,有以下缘由:

1.大厂带节奏

国内作互联网的 Java 程序不少都是拷贝阿里的,阿里一开始用例 iBatis,大量的老系统都是基于 iBatis/MyBatis 的,市场上对 MyBatis 熟悉的人才更多,招聘和培训更容易,有的青年程序员觉得“MyBatis 早已统一全球了”就是一个很好的证实。

2.简单,学习成本低

小公司须要大量入门级的程序员,像大神甚至一个都请不起,请问大神们那些牛 b 框架哪一个更快让菜鸟们上手,下降公司学习成本。注意这个成本会一直跟随公司,想必大神们创业直接先后端分离了,毕竟钱嘛多的是。

3.对于复杂性需求的灵活性高

国内绝大部分项目都是面向表结构编程的,把 java 对象仅当成数据容器,查询和模型变动都设计在一张表上,所谓业务逻辑就是一堆增删改查的 sql 集合,固然用 mybatis 方便。

在逻辑不复杂,或者你判断软件生命周期不会超过一年的时候,直接用表结构编程是最方便快捷的。

国内广泛都是分布式,流量和性能决定了须要常常进行优化,而是用 Mybatis 对复杂需求的优化很方便。

4.公司环境

国内好多项目都是应付领导的某些奇葩需求。须要面向领导编程。一大半时间其实都是在解决领导的需求。

国内项目须要大量报表统计,须要提供给领导做为决策。看到这里,各位领导不要骂我 ,真的不是黑领导的。

5.Hibernate学习成本高

虽然,实际上 SpringDataJPA 是很是简单的,可是,可是,JPA/Hibernate 后期调试跟踪问题很麻烦,改起来也麻烦。别忘了,牛逼如你的人全公司甚至一个都没。

还有什么缓存什么 Criteria 什么 Lazy,虽然这些你学了也不见得能用上,但一个框架,你不学仍是不行的。

推荐阅读:JPA、Hibernate、Spring Data JPA 的关系

并且,JPA 对于增删改很方便,复杂查询倒是软肋,有同窗会说,JPA 也能写 SQL 语句啊,我想说的是,既然都用 orm 了,你再写 sql,那不就失去了 oop 的内涵了吗?不优雅好吧。

4、老外喜欢 JPA 的缘由

1.不少老外对 Mybatis 的认知还停留在 iBatis 阶段

实际上在 Mybatis 的应用场景里面,开发者要的就是自动封装,把 sql 查询结果转化为指定的 java 对象。

这个在 iBatis 阶段,须要开发者本身定义大量的 xml 配置,去指定数据库表字段与 Java 实体类之间的关系。而且,对于每一条 sql,都须要在 xml 中写相应的语句,虽然有代码生成器,带开发量仍是不小的。

但 Mybatis 发展到今天,已经很是完美地作好了自动封装数据对象这件事,支持的插件也比较丰富。对于常见的增删改查,也不须要本身写一行代码,这已经无限接近于 Hibernate 的能力了。

推荐阅读:为何老外都不肯意用MyBatis?

2.喜欢 OOP、DDD

认为写 SQL 不优雅,用 jpa 的核心是让咱们关注对象建模,而不是关心底层数据库映射。只有你在考虑数据和行为在一块儿的充血模型、贴身职责,聚合根状态变迁,值对象不变性的状况下,你才会发现 jpa 给你提供了不少便利,根本不须要关注底层存储模型。

在复杂的逻辑、超长的软件生命周期。使用 DDD 的设计方法是目前看比较合理的选择,维护的成本比较低。

DDD 全称是(Domain-Driven Design)这是 2004 年就出来的理论,复杂逻辑的应对之道。DDD 大会在欧洲等地办了一届又一届,CQRS、Event Sourcing 等探索层出不穷,这也是为何国外比较流行 JPA 缘由。

不过,国内主要是随着这两年随着微服务火爆也有人谈起来 DDD 了。但其实 DDD 也不是银弹,须要大拿能把控全局,国内缺的就是这种大拿,搬砖的太多。

3.有些老外在技术选型时,不会考虑除 Spring 这种知名框架外的其余技术,无他,惟手熟尔。

Spring确实很强,我也写了 N 篇最新 Spring 教程,关注微信公众号:Java技术栈,在后台回复:spring,能够获取,都是干货。

国外一个项目,作了几年十几年都是很正常的。我之前接触过一个国外的的电商项目,作了十几年,也跑的好好的,这就是证据。

使用技术也是有惯性的。

4.数据体量和种类没有达到

我的感受,也咨询了国际友人。老外的项目,在数据体量和种类上彻底达不到国内的水平。

因此,他们对于性能上的渴求度没有那么高。追求的是稳定,可维护性好。国内一个双 11,若是用 hibernate,那只能死掉了。

推荐阅读:淘宝千万并发,14 次架构演进…

也说明,老外的需求主要是在业务上,技术层面较少考虑。

5、一点感悟

整个情况,和对 OOAD 的重视有很大关系,我在作 DDD 技术落地的时候,用 MyBatis 很是蹩脚,用 JPA/Hibernate 会好不少。

JPA/Hibernate 比较复杂,团队中要有人 Hold 住它,不然及其容易踩坑;另外,真要使用,建议使用它的一个功能子集,不要全部功能都用。也能够尝试使用更简单 EBean ORM。

JPA/Hibernate 对分库分表的支持有一下坑。虽然,使用 Shareding-JDBC 或 MyCat 等技术,能够不关心分库分表,可是,JPA/Hibernate 在某些状况下(好比加载子集合的时候)可能会不带分区键。国外分库分表的少,国内几乎是标配。

6、Mybatis 和 JPA 大比较

最后,从多维度对这两个知名框架作些比较:

最后的最后,欢迎在评论区留下你最宝贵的意见 ,勿喷哦!

最后的最后,关于这个话题,你怎么看待的?欢迎在底部留言!

参考:zhihu.com/question/50729231/answer/549761974
来源:blog.csdn.net/m0_37609579/article/details/102961765

推荐去个人博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

以为不错,别忘了点赞+转发哦!

相关文章
相关标签/搜索