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

在很多人看來,這是一個很SB的標題,阿里MyBatis用得好好的,幹嘛要換Hibernate?還問我扛不扛得住?就問小天你抗揍不嘛?

其實這個問題就要回歸到一個非常常見的面試題上——MyBatis與Hibernate有哪些不同?

這是這篇文章的核心立意,具體的答案,咱們文章後面會給出來!

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

小天看過很多類似於“在MyBatis與Hibernate之間該如何做選擇”的文章,無一不對兩者之前的選型做了比較明確的詮釋。

那麼,在技術相對成熟的阿里,他們是怎樣選擇的呢?


阿里的618和雙十一

618將至,對各大電商平臺又是一大考驗。面對618、雙11流量洪峯,阿里京東都用了哪些技術?今天我們聊聊阿里的持久層選擇。

衆所周知,阿里巴巴的持久層選擇了MyBatis框架。

但是根據JVM生態系統報告,在ORM框架中使用MyBatis的佔比僅有6%!大量國外企業和開發者,更傾向於使用Hibernate。MyBatis似乎只在國內流行?相信很多人都用過hibernate,你覺得它與MyBatis哪個更優秀呢?

618已至,阿里如果把MyBatis換成hibernate,能扛得住嗎?
標ORM使用狀況題

 

阿里巴巴的持久層爲什麼選擇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、雙十一這種大促,那只有死路一條了。

所以阿里巴巴的持久層拋棄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學習路線

 

但是很多工作3、5年的程序員,對於MyBatis的諸多妙用依然一知半解。MyBatis其實學習起來不難,但是自行學習的話很容易遇到各種問題,比如導入MyBatis源碼時報錯;一對多查詢時,只查詢到一條或部分數據等…

如果說你覺得你對MyBatis已經很熟悉了,那這5個MyBatis經典面試題,你能答上來幾個?

  1. MyBatis源碼中用了哪些設計模式?爲什麼要用這些設計模式?
  2. 日誌級別設置爲Debug之後,在控制檯能打印訪問數據庫的sql語句等信息,在Mybatis中這是怎麼實現的?實現過程中使用了什麼設計模式?
  3. MyBatis是如何爲二級緩存動態添加日誌、同步控制、阻塞、緩存淘汰策略等附加能力的?用了什麼設計模式?
  4. 請描述從數據庫連接池獲取一個數據連接的過程。
  5. 什麼是緩存雪崩?如何解決?

另外,小天在準備向着阿里進發,目前備戰面試有一套系統的面試題,免費分享給大家,私信“阿里”免費獲取領取方式!

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章