关于SQL和ORM的争论永远不会结束,我也一直在思考。昨天和群里的小伙伴们讨论了一下,还是有些感触,才有了今天的这篇文章。免责声明:本文不会对Mybatis和JPA这两个持久层框架哪个更好下结论。只是陈述事实和说理,请勿喷评委。一、事件的起因关于Mybatis和JPA的优劣,争论了很多年。一直没有定论,毕竟每个人的喜好和习惯都大不相同。也看了知乎上的一些问答,各有各的道理,感觉都说的有道理。如果让我不带感情地说出区别,我其实会一头雾水,因为大众是对的,女人是对的。在国内,不得不承认,到今年(2019年),使用Mybatis的公司确实比JPA多,但是在2015年之前,使用Hibernate的公司确实很多。为什么在中国会出现这样的现象?而在国外,老外会不会一如既往的使用JPA呢?我们来分析分析。2.目前的生态在最近的(2018)JVM生态系统报告(https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application/)中,Mybatis的使用率非常低。可以看图:可以看出Mybatis的占比只有可怜的6%。看到这个统计结果你应该会感到惊讶。你会想,不会吧,我公司还有很多朋友都在用Mybatis。好像没有我听说有人用JPA。这个统计结果错了吗?造成这种印象的原因也很简单,因为语言和技术的流行程度存在地域偏差。再看看GoogleTrends就明白了:red一些是Mybatis的主要用户。从下面的对比来看,MyBatis主要针对中日韩三国。你知道为什么日本和韩国也高吗?猜对了就有奖,哈哈!首先必须指出,对于年轻的程序员来说,他们其实会质疑这张图的可信度。中老年程序员都在感叹,国外其实更注重开发效率和面向对象的分析设计。但是我可以很负责任的告诉你,这张图是真的。那么,造成这种现象的原因是什么?3、中国人喜欢Mybatis的原因可以归纳为以下几点:1、国内很多大公司用来做互联网的Java程序都是从阿里抄来的。阿里最先用的是iBatis(日本韩国怎么回事)。大量老系统都是基于iBatis/MyBatis。市场上熟悉MyBatis的人才比较多,招聘和培养也比较容易。一些年轻的程序员认为“MyBatis已经统一了世界”就是一个很好的证明。2.简单,学习成本低小公司需要大量的入门级程序员,即使是高手也请不起。请问各位大神哪个框架比较适合菜鸟上手,降低公司的学习成本。请注意,此费用将始终跟随公司。想必大神们创业后直接前后端分离了。毕竟钱多。3.复杂需求的高度灵活性。国内大部分项目都是针对表结构编程的。Java对象只是作为数据容器,查询和模型变化都设计在一张表上。所谓业务逻辑就是一堆增量当然用mybatis删除、修改、查看sql集合很方便。当逻辑不复杂,或者你判断软件生命周期不会超过一年的时候,直接用表结构编程是最方便快捷的。国内普遍分布,流量和性能决定了需要经常优化,但是用Mybatis优化复杂的需求还是很方便的。4.政治环境国内很多项目都是为了满足领导的一些奇葩需求而设计的。需要面向领导的编程。大部分时间其实都是在解决领导的需求。国内的项目需要大量的报表和统计(可以看到帆软卖的那么好),需要提供给领导做决策。看到这里,各位领导不要骂我,真的不是黑领导。5.Hibernate的学习成本很高。其实SpringDataJPA很简单。但是后期的JPA/Hibernate调试跟踪问题很麻烦,改起来也麻烦。别忘了,公司里没有一个人像你这么厉害。cache、Criteria和Lazy还有什么?虽然这些你学了不一定会用,但是一个框架你不学是行不通的。而且JPA增删改查很方便,复杂查询弱。有的同学会说JPA也可以写SQL语句。我想说的是,既然用了ORM,再写sql就丢了。是oop的内涵吗?不优雅。四、老外喜欢JPA的原因1.很多老外对Mybatis的了解还停留在iBatis阶段。其实就是在Mybatis的应用场景中。开发者想要的是自动封装,将SQL查询结果转换成指定的java对象。在iBatis阶段,开发者需要定义大量的xml配置来指定数据库表字段与Java实体类之间的关系。而且,对于每一个sql,都需要在xml中写出对应的语句。虽然有了代码生成器,但开发量还是不小。但是Mybatis发展到今天,在数据对象的自动封装方面做得非常好,而且支持非常多的插件。对于常见的增删改查,不需要自己写一行代码,无限接近Hibernate的能力。2、喜欢OOP和DDD,觉得写SQL不优雅。使用jpa的核心是让我们专注于对象建模,而不是底层数据库映射。只有当你考虑数据和行为的充血模型、个人职责、聚合根状态变化、值对象不变性时,你才会发现jpa为你提供了很多便利,你不需要关注底层存储模型。逻辑复杂,软件生命周期长。使用DDD的设计方法是目前比较合理的选择,维护成本也比较低。DDD的全称是(Domain-DrivenDesign)。这是2004年出来的理论,是一种处理复杂逻辑的方法。DDD大会在欧洲等地相继召开,CQRS、EventSourcing等探索也相继涌现,这也是JPA在国外比较流行的原因。但是在国内,主要是这两年微服务的火爆,有人开始讲DDD了。但事实上,DDD并不是灵丹妙药。需要一个高手来掌控全局。中国缺的就是这种高手,砖头太多了。3.有些老外在选择技术的时候不会考虑除了Spring这个知名框架之外的其他技术,只是熟悉而已。一个国外的项目做几年或者更长时间很正常。之前接触过巴基斯坦的一个电商项目。我已经为它工作了十多年,它运行良好。这就是证据。使用技术也有惯性。4.数据量和类型不符合我个人感受,也请教了国际友人。国外的项目在数据量和类型上都达不到国内水平。因此,他们对业绩的渴望并没有那么高。追求的是稳定性和良好的可维护性。国内一个双11,要是用hibernate,那只能死了。也说明老外的需求主要在业务上,较少考虑技术层面。第五,对整体情况略有了解,与对OOAD的重视有很大关系。我在做DDD技术实现的时候,用MyBatis很蹩脚,用JPA/Hibernate会好很多。JPA/Hibernate比较复杂,团队中要有人hold住,否则极易踩坑;另外,如果你真的要使用它,建议只使用它的一个子集的功能,而不是所有的功能。也可以尝试更简单的EBeanORM。JPA/Hibernate对分库分表的支持有一个坑。虽然,使用Sharing-JDBC或MyCat等技术,可以不关心分库分表,但JPA/Hibernate在某些情况下(如加载子集合时)可能没有分区键。国外分库分表很少,国内几乎是标配。6、Mybatis和JPA的对比最后从多个维度对比一下这两个知名框架:最后,欢迎在评论区留下你最宝贵的意见,勿喷!参考资料:https://www.zhihu.com/question/50729231/answer/549761974趋势图来源:https://trends.google.com/trends/explore?q=%2Fm%2F04t80p,MyBatis编辑:安全队长图片:茂仙法师
