618已至,阿里若是把MyBatis换成hibernate,能扛得住吗?

在不少人看来,这是一个很SB的标题,阿里MyBatis用得好好的,干吗要换Hibernate?还问我扛不扛得住?就问小天你抗揍不嘛?java

其实这个问题就要回归到一个很是常见的面试题上——MyBatis与Hibernate有哪些不一样?mysql

这是这篇文章的核心立意,具体的答案,我们文章后面会给出来!程序员

618已至,阿里若是把MyBatis换成hibernate,能扛得住吗?

小天看过不少相似于“在MyBatis与Hibernate之间该如何作选择”的文章,无一不对二者以前的选型作了比较明确的诠释。面试

那么,在技术相对成熟的阿里,他们是怎样选择的呢?sql


阿里的618和双十一

618将至,对各大电商平台又是一大考验。面对61八、双11流量洪峰,阿里京东都用了哪些技术?今天咱们聊聊阿里的持久层选择。数据库

众所周知,阿里巴巴的持久层选择了MyBatis框架。设计模式

可是根据JVM生态系统报告,在ORM框架中使用MyBatis的占比仅有6%!大量国外企业和开发者,更倾向于使用Hibernate。MyBatis彷佛只在国内流行?相信不少人都用过hibernate,你以为它与MyBatis哪一个更优秀呢?缓存

618已至,阿里若是把MyBatis换成hibernate,能扛得住吗?
标ORM使用情况题

 

阿里巴巴的持久层为何选择MyBatis?若是换成hibernate,可否扛住61八、双11?mybatis

关于这些疑问,也和不少同事讨论过,最后仍是阿里的一位大神给出了答案:架构

一、阿里在mysql上下了大功夫,对数据查询的要求也比较高,不少sql查询都要精心设计;

 

二、阿里这种scale的网站服务,对cache的依赖是很是大的,对cache逻辑的要求很是高,并且必定要具体问题,具体优化。hibernate自带的cache并不能知足像阿里这样的公司的需求;

 

三、hibernate在你项目开始时候省事,可是会致使业务逻辑模型和数据库模型互相依赖的程度过高,一旦项目变迁,随便改一处数据库的schema,整个java项目可能要改几十处!而MyBatis的自动mapping作的也不差,开发起来也没多花多少时间。等项目进入中后期,你须要大量定制和优化查询的时候,MyBatis的开发效率就胜出了。

 

四、不少地方Hibernate能够强大到只用一行代码解决不少问题,但好比说一个update()或者save()到底作了什么,这里既有hibernate自己的逻辑,也有你应用的逻辑,若是这一行产生了问题,你该如何去作?而MyBatis的开发和调优更加方便简单。

阿里若是用hibernate,平时还好,遇上61八、双十一这种大促,那只有死路一条了。

因此阿里巴巴的持久层抛弃hibernate,采用了MyBatis框架。

MyBatis和hibernate

先来讲说它们的区别:

1)Mybatis和hibernate不一样,它不彻底是一个ORM框架,由于MyBatis须要程序员本身编写Sql语句,不过mybatis能够经过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

2)Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,很是适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,由于这类软件需求变化频繁,一旦需求变化要求成果输出迅速。可是灵活的前提是mybatis没法作到数据库无关性,若是须要实现支持多种数据库的软件则须要自定义多套sql映射文件,工做量大。

3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)若是用hibernate开发能够节省不少代码,提升效率。可是Hibernate的缺点是学习门槛高,要精通门槛更高,并且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate须要具备很强的经验和能力才行。

总之,按照用户的需求在有限的资源环境下只要能作出维护性、扩展性良好的软件架构都是好架构,因此框架只有适合才是最好。

可是,小天是推荐你们用MyBatis的,为啥呢?

人家阿里用这个,你以为他面试会问hibernate吗?

另外,Mybatis简单高效, 学习成本低,不多增长工做量;架构来讲功能单一,场景明确,耦合度低,无状态,面向sql 语句的,便于在业务代码里分布式部署,优化起来也方便,很是符合如今的开发节奏。

618已至,阿里若是把MyBatis换成hibernate,能扛得住吗?
标题MyBatis学习路线

 

可是不少工做三、5年的程序员,对于MyBatis的诸多妙用依然只知其一;不知其二。MyBatis其实学习起来不难,可是自行学习的话很容易遇到各类问题,好比导入MyBatis源码时报错;一对多查询时,只查询到一条或部分数据等…

若是说你以为你对MyBatis已经很熟悉了,那这5个MyBatis经典面试题,你能答上来几个?

  1. MyBatis源码中用了哪些设计模式?为何要用这些设计模式?
  2. 日志级别设置为Debug以后,在控制台能打印访问数据库的sql语句等信息,在Mybatis中这是怎么实现的?实现过程当中使用了什么设计模式?
  3. MyBatis是如何为二级缓存动态添加日志、同步控制、阻塞、缓存淘汰策略等附加能力的?用了什么设计模式?
  4. 请描述从数据库链接池获取一个数据链接的过程。
  5. 什么是缓存雪崩?如何解决?

另外,小天在准备向着阿里进发,目前备战面试有一套系统的面试题,免费分享给你们,私信“阿里”免费获取领取方式!

618已至,阿里若是把MyBatis换成hibernate,能扛得住吗?