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

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

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

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

小天看过很多类似于“在MyBatis与Hibernate之间该如何做选择”的文章,无一不对两者之前的选型做了比较明确的诠释。

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


阿里的618和双十一

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

众所周知,alibaba的持久层选择了MyBatis框架。

但是根据JVM生态系统报告,在ORM框架中使用MyBatis的占比仅有6%!大量国外企业和开发者,更倾向于使用Hibernate。MyBatis似乎只在国内流行?相信很多人都用过hibernate,你觉得它与MyBatis哪个更优秀呢?

ORM使用状况

alibaba的持久层为什么选择MyBatis?如果换成hibernate,能否扛住618、双11?

关于这些疑问,也和很多同事讨论过,最后还是阿里的一位大神给出了答案:

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

2、阿里这种scale的网站服务,对cache的依赖是非常大的,对cache逻辑的要求非常高,而且一定要具体问题,具体优化。hibernate自带的cache并不能满足像阿里这样的企业的需求;

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

4、很多地方Hibernate可以强大到只用一行代码解决很多问题,但比如说一个update()或者save()到底做了什么,这里既有hibernate本身的逻辑,也有你应用的逻辑,如果这一行产生了问题,你该如何去做?而MyBatis的开发和调优更加方便简单。

阿里如果用hibernate,平时还好,赶上618、双十一这种大促,那只有死路一条了。

所以alibaba的持久层抛弃hibernate,采用了MyBatis框架。

MyBatis和hibernate

先来说说它们的区别:

1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终实行的sql,最后将sql实行的结果再映射生成java对象。

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

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

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

但是,小天是推荐大家用MyBatis的,为啥呢?

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

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

MyBatis学习路线

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

如果说你觉得你对MyBatis已经很熟悉了,那这5个MyBatis经典面试题,你能答上来几个?

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

另外,小天在准备向着阿里进发,目前备战面试有一套系统的面试题,免费分享给大家,帮小天转发一下文章,私信“阿里”免费获取领取方式!>或点击此处,免费领取资料