為啥國人偏愛 Mybatis,而老外喜歡 Hibernate/JPA 呢?

2021-03-02 Java基基

關於SQL 和 ORM 的爭論,永遠都不會終止,我也一直在思考這個問題。昨天又跟群裡的小夥伴進行了一番討論,感觸還是有一些,於是就有了今天這篇文。

聲明:本文不會下關於 Mybatis 和 JPA 兩個持久層框架哪個更好這樣的結論。只是擺事實,講道理,所以,請各位看官勿噴。

一、事件起因

關於 Mybatis 和 JPA 孰優孰劣的問題,爭論已經很多年了。一直也沒有結論,畢竟每個人的喜好和習慣是大不相同的。我也看過知乎上一些問答,各有各的理由,感覺都挺有道理。如果讓我不帶感情色彩地去分辨,其實我也是懵的,因為真的是公說公有理婆說婆有理。

而在國內,不得不承認,到今年(2019 年),用 Mybatis 的公司確實是要比用 JPA 的多,但是在 2015 年以前,用 Hibernate 的公司確實也是很多的。為什麼在國內,會有這樣的現象發生?而在國外,老外會一如既往地使用 JPA 呢?我們來分析分析。

二、目前生態

在最近(2018)的 JVM 生態報告中(https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application/),Mybatis是使用率是很低的。可以看圖:

可以看出,Mybatis 的佔比只有可憐的 6%,大家看到這個統計結果應該會很吃驚,你會覺得,不對啊,我公司以及我很多朋友都在用 Mybatis 啊,好像沒聽說過有人用 JPA 的,這個統計結果是錯的吧?造成這種印象的原因也很簡單,因為語言和技術的流行度有地域性偏差的,接著來看下 Google Trends 就明白了:

紅色部分是 Mybatis 的主要使用人群。

圖違規,刪除了。

再從下面這個對比來看,MyBatis 的關注主要集中在中日韓。知道日韓為啥也高嗎,猜中有獎哦,哈哈!

首先,必須指出,對於青年程式設計師,其實都會質疑這個圖的可信度。中老年程式設計師都在感嘆國外其實更注重開發效率和面向對象的分析和設計。但我可以非常負責任地告訴你,這圖是真的。那麼,造成這種現象的原因是?

三、國人喜歡 Mybatis 的原因

總結起來,有如下原因:

1.大廠帶節奏 國內做網際網路的 Java 程序很多都是拷貝阿里的,阿里一開始用例 iBatis(日本韓國是怎麼回事呢)。大量的老系統都是基於 iBatis/MyBatis 的,市場上對 MyBatis 熟悉的人才更多,招聘和培訓更容易,有的青年程式設計師以為「MyBatis 早已統一全球了」就是一個很好的證明。

2.簡單,學習成本低 小公司需要大量入門級的程式設計師,像大神甚至一個都請不起,請問大神們那些牛 b 框架哪個更快讓菜鳥們上手,降低公司學習成本。注意這個成本會一直跟隨公司,想必大神們創業直接前後端分離了,畢竟錢嘛多的是。

3.對於複雜性需求的靈活性高 國內絕大部分項目都是面向表結構編程的,把 java 對象僅當成數據容器,查詢和模型變更都設計在一張表上,所謂業務邏輯就是一堆增刪改查的 sql 集合,當然用 mybatis 方便。在邏輯不複雜,或者你判斷軟體生命周期不會超過一年的時候,直接用表結構編程是最方便快捷的。

國內普遍都是分布式,流量和性能決定了需要經常進行優化,而是用 Mybatis 對複雜需求的優化很方便。

4.政治環境 國內好多項目都是應付領導的某些奇葩需求。需要面向領導編程。一大半時間其實都是在解決領導的需求。國內項目需要大量報表統計(看看帆軟賣的這麼好就知道了),需要提供給領導作為決策。看到這裡,各位領導不要罵我 ,真的不是黑領導的。

5.Hibernate 學習成本高 雖然,實際上 SpringDataJPA 是非常簡單的,但是,但是,JPA/Hibernate 後期調試跟蹤問題很麻煩,改起來也麻煩。別忘了,牛逼如你的人全公司甚至一個都沒。還有什麼緩存什麼 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-Driven Design)這是 2004 年就出來的理論,複雜邏輯的應對之道。DDD 大會在歐洲等地辦了一屆又一屆,CQRS、Event Sourcing 等探索層出不窮,這也是為什麼國外比較流行 JPA 原因。

不過,國內主要是隨著這兩年隨著微服務火爆也有人談起來 DDD 了。

但其實 DDD 也不是銀彈,需要大拿能把控全局,國內缺的就是這種大拿,搬磚的太多。

3.有些老外在技術選型時,不會考慮除 Spring 這種知名框架外的其他技術 無他,唯手熟爾。國外一個項目,做了幾年十幾年都是很正常的。我以前接觸過一個巴基斯坦的電商項目,做了十幾年,也跑的好好的,這就是證據。

使用技術也是有慣性的。

4.數據體量和種類沒有達到 個人感覺,也諮詢了國際友人。老外的項目,在數據體量和種類上完全達不到國內的水平。所以,他們對於性能上的渴求度沒有那麼高。追求的是穩定,可維護性好。國內一個雙 11,如果用 hibernate,那只能死掉了。

也說明,老外的需求主要是在業務上,技術層面較少考慮。

五、一點感悟

整個狀況,和對 OOAD 的重視有很大關係,我在做 DDD 技術落地的時候,用 MyBatis 非常蹩腳,用 JPA/Hibernate 會好很多。

JPA/Hibernate 比較複雜,團隊中要有人 Hold 住它,否則及其容易踩坑;另外,真要使用,建議使用它的一個功能子集,不要所有功能都用。也可以嘗試使用更簡單 EBean ORM。

JPA/Hibernate 對分庫分表的支持有一下坑。雖然,使用 Shareding-JDBC 或 MyCat 等技術,可以不關心分庫分表,但是,JPA/Hibernate 在某些情況下(比如加載子集合的時候)可能會不帶分區鍵。國外分庫分表的少,國內幾乎是標配。

六、Mybatis 和 JPA 大比較

最後,從多維度對這兩個知名框架做些比較:

最後的最後,歡迎在評論區留下你最寶貴的意見 ,勿噴哦!

參考資料:https://www.zhihu.com/question/50729231/answer/549761974

相關焦點

  • 為啥國人偏愛Mybatis,而老外喜歡Hibernate/JPA呢?
    而在國外,老外會一如既往地使用 JPA 呢?我們來分析分析。二、目前生態在最近(2018)的 JVM 生態報告中(https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application/),Mybatis是使用率是很低的。可以看圖:
  • 國人鍾情於Mybatis,而老外卻喜歡Hibernate/JPA,為啥?
    # 國人喜歡Mybatis的原因總結起來,有如下原因:1.大廠帶節奏國內做網際網路的Java程序很多都是拷貝阿里的,阿里一開始用例iBatis(日本韓國是怎麼回事呢)。# 老外喜歡JPA的原因1.很多老外對Mybatis的認知還停留在iBatis階段實際上在Mybatis的應用場景裡面,開發者要的就是自動封裝,把sql查詢結果轉化為指定的java對象。這個在iBatis階段,需要開發者自己定義大量的xml配置,去指定資料庫表欄位與Java實體類之間的關係。
  • MyBatis JPA Extra,MyBatis JPA 擴展 v2.2 發布
    ;import org.apache.mybatis.jpa.test.domain.Students;import org.apache.mybatis.jpa.util.WebContext;import
  • mybatis-plus 2.1.8-SNAPSHOT 發布,代號:翻車魚
    mybatis-plus 是一款 mybatis 動態 SQL 自動注入 mybatis 增刪改查 CURD 操作中間件。
  • 乾貨|一文讀懂 Spring Data Jpa!
    persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider
  • 神吐槽:國人眼中的土味中文名字,為啥受到歪果仁追捧?
    新鮮有料,奇葩搞笑每天最新奇葩段子神文案話不多說,開始今天的吐槽:話說起名困難面前人人平等,在國人為了有個獨特的英文名絞盡腦汁的同時,踏上學中文的快(不)樂(歸)旅(路)途的歪果仁也花樣頻出最便捷的莫過於ctrl+v歷史人物還有各種土嗨風中文名……不禁讓人大呼居然還能這樣玩
  • 小學妹問:Mybatis常見註解有哪些?
    那,在Mybatis中又有哪些註解呢?org.mybatis.spring.annotation.MapperScan使用方式@SpringBootApplication@MapperScan("com.tian.mybatis.mapper")public class Application {}
  • 英國老外第一次來中國,剛進超市就哭了:為啥我們沒有?
    英國老外第一次來中國,剛進超市就哭了:為啥我們沒有?在我國的每個城市,幾乎都會有一些大型的超市,在這些超市裡面的商品可謂是琳琅滿目,而且很多的不同的商品都是單獨劃區域的。而且中國人非常注重飲食,在中國有著很多的食物是國外所沒有的,英國老外第一次來中國,剛進超市就哭了:為啥我們沒有?這到底是怎麼一回事呢?原來當英國的老外來到中國超市後,發現了有自熱米飯和自熱火鍋這種食物。這讓老外感到非常的不可思議,因為在國外這種食物根本是沒有的,即使想買也買不到。
  • 在老外的眼裡,演技最差的中國女明星都有誰?
    老外與咱們國人的審美是完全不一樣的,對於演技這方面的要求也不一樣,那麼在他們眼裡,中國演員演技如何呢?baby的前面,要知道楊冪在國內可是有很多火的電視劇,比如《宮》、《古劍奇譚》、《三生三世十裡桃花》等等,雖說演技不是特別好,但大部分觀眾還是認可的,她這個排名可能是因為老外和咱們中國人的想法不一樣吧,認為她的演技不咋樣!
  • 外國人不理解:明明賽百味比肯德基更好吃,為啥中國人不喜歡呢?
    外國人不理解:明明賽百味比肯德基更好吃,為啥中國人不喜歡呢?對於現在的人們來講,壓力是非常大的,因此隨處可見都是快節奏的方式,不管是上下班也好還是吃飯也好,都講究一個效率。我們國家很少人會知道有這麼一家店,但是對於不少老外來說,他們日常吃的快餐不是肯德基而就是這個,這也就讓很多老外不明白了,明明賽百味更加好吃,為什麼中國人不愛賽百味呢?也許是賽百味在飲食上更「專一」,其基本上沒有太多可以選擇,就招牌漢堡,這是讓老外非常喜歡的一個原因。
  • 六神花露水給國人長臉,老外用法出新招,你知道老外叫它什麼嗎?
    六神花露水因為在咱們國人心目中的地位比較高,被網友親切地稱為「Six God Toilet water」。但是,要進軍海外市場的話,肯定要有一個正式的名字。六神花露水也是這麼考慮的,給自己取名「Florida Water」。直譯的話,就是佛羅裡達水。
  • 老外經常吃不全熟牛排,為啥很少染寄生蟲?其實原因很簡單
    老外經常吃不全熟牛排,為啥很少染寄生蟲?其實原因很簡單每個國家都有不同的飲食習慣,我們中國人都喜歡把肉做熟了再吃,而老外們更喜歡生著吃。就拿牛排來說,老外們喜歡吃三分熟或者五分手,切開的牛排中間還有紅色的肉,有的甚至可以切出血水。
  • 老外網評中國最「土」的4種糕點,荷花酥上榜,國人:真不識貨
    由於文化差異的不同,有些外國人可能不是很能理解我們國家的傳統糕點,認為我們的糕點花樣越多越土,但相反越是花樣精緻的糕點就受越歡迎,我們國人都認為那是我們國家的特色,而老外網評中國最「土」的4種糕點,荷花酥上榜,國人:真不識貨,趕緊讓我們一起來看看吧。
  • 老外的漢字紋身、國人的英文T恤,世界兩大文化鴻溝
    比伯胸前紋了個「慫」字,對於國人來說,大家都不喜歡別人用這個字來形容自己,但想不到大牌明星會把它紋到身上。「慫」字拆開,是一個「從」和一個「心」,或許意為「follow my heart」。但不懂漢字的紋身師把這倆字刺得太近了,就成了一個貶義詞。
  • 老外不會吃的4種網紅甜點,髒髒包排行第三,最後1種國人早已吃膩
    網紅甜點一直是國人的最愛,不管是走到哪裡只要有網紅甜點的出現,就會有許多人想去買,為了就是滿足自己的味蕾,讓自己的心情也變得更好,從而感受到食物帶來的快樂,老外對國內容的有些網紅甜點不會吃,會感覺到很奇怪,對味道也很好奇,而老外不會吃的4種網紅甜點,髒髒包排行第三,最後1種國人早已吃膩,一起看看吧。
  • 有種「審美」叫林永健的「女兒」,國人吐槽醜,老外卻捧成女神
    按照國人的傳統審美,女孩子就必須是大眼睛雙眼皮,瓜子臉櫻桃小嘴。然而並不是每個人都那麼幸運,生活中有不少人的長相就"顛覆"了大家的審美。即便是明星也逃不過,李榮浩、孫紅雷、林永健等人就經常被大家做成表情包。
  • 國人吃這幾種食物是有「特殊技能」的,老外怎麼也學不來!
    隨著生活水平的逐漸提升,大家在各個方面都得到了很好的發展呢,物質需求都大大提高了,像一些條件比較好的家庭,都會老想著去外地或出國旅遊啥的,去看看外面的世界,品嘗一些不一樣的美食。當然不僅僅只有我國人才會這麼想,老外們也會想著來我國旅遊呢,不過很多老外主要都是被我國的美食所吸引過來的,但是,有一部分的中國美食卻受到了老外們的反感,原來並不是味道不好的問題,是他們不會吃,這還真是有點搞笑了,咱國人吃這幾種食物都得有一定的「特殊技能」才能享用到,難怪老外們都學不來。
  • 4種老外「寧死不吃」的中國菜,貝爺都怕了,國人全敢吃也是大神
    4種老外「寧死不吃」的中國菜,貝爺都怕了,國人全敢吃也是大神! 臭豆腐:長沙臭豆腐正所謂聞著臭吃起來香。
  • 從0 開始手寫一個 Mybatis 框架,三步搞定!
    我們對上圖進行分析總結:1、mybatis的配置文件有2類mybatisconfig.xml,配置文件的名稱不是固定的,配置了全局的參數的配置,全局只能有一個配置文件。Mapper.xml 配置多個statemement,也就是多個sql,整個mybatis框架中可以有多個Mappe.xml配置文件。
  • 在巴基斯坦工作的中國男人:絕不會娶當地女性,這是為啥呢?
    文/仗劍走天涯在巴基斯坦工作的中國男人:絕不會娶當地女性,這是為啥呢?並且巴基斯坦對中國遊客也是很熱情,每當面對去巴基斯坦旅遊的中國遊客,中國遊客都能夠很明顯的能夠感受到,巴基斯坦人對於中國遊客的偏愛。隨著中國和巴基斯坦之間的經濟聯繫不斷的加深,我國也有一些的外派工作人員會被派往巴基斯坦,在巴基斯坦進行一些工作上的交往。不過在巴基斯坦工作的國人都表示,是不會娶當地的巴基斯坦女人的,你們知道這是為什麼嗎?