Mybatis 和 JPA 用哪個好? 優缺點 ?

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

一、事件起因

關于 Mybatis 和 JPA 孰優孰劣的問題,爭論已經很多年了。一直也沒有結論,畢竟每個人的喜好和習慣是大不相同的。

我也看過知乎上一些問答,各有各的理由,感覺都挺有道理。如果讓我不帶感情色彩地去分辨,其實我也是懵的,因為真的是公說公有理婆說婆有理。

而在國內,不得不承認,用 Mybatis 的公司確實是要比用 JPA 的多,但是在 2015 年以前,用 Hibernate 的公司確實也是很多的。

為什么在國內,會有這樣的現象發生?

二、目前生態

?

在最近(2018)的 JVM 生態報告中可以看出,Mybatis 的占比只有可憐的 6%,大家看到這個統計結果應該會很吃驚,你會覺得,不對啊,我公司以及我很多朋友都在用 Mybatis 啊,好像沒聽說過有人用 JPA 的,這個統計結果是錯的吧?

?

再從下面這個對比來看,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 的內涵了嗎?不優雅好吧。mybaits 項目案例大全:www.1b23.com 。

四、老外喜歡 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 這種知名框架外的其他技術,無他,唯手熟爾。

Spring確實很強,國外一個項目,做了幾年十幾年都是很正常的。我以前接觸過一個國外的的電商項目,做了十幾年,也跑的好好的,這就是證據。

使用技術也是有慣性的。

4.數據體量和種類沒有達到

個人感覺,也咨詢了國際友人。老外的項目,在數據體量和種類上完全達不到國內的水平。

所以,他們對于性能上的渴求度沒有那么高。追求的是穩定,可維護性好。國內一個雙 11,如果用 hibernate,那只能死掉了。

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


---------------------
作者:FH-Admin
來源:CSDN
原文:https://blog.csdn.net/u010253246/article/details/105731204/
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284142.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SkiaSharp 之 WPF 自繪 五環彈動球(案例版)

此案例基于拖曳和彈動球兩個技術功能實現,如有不懂的可以參考之前的相關文章,屬于遞進式教程。五環彈動球好吧,名字是我起的,其實,你可以任意個球進行聯動彈動,效果還是很不錯的,有很多前端都是…

【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用)

本文講述globalmapper軟件在無人機航測了內業處理中的應用之:瀏覽地理照片及航線信息、相機參數、元數據編輯器。 文章目錄 1. 航線信息瀏覽2. 地理圖像瀏覽2.1 數字化工具2.2 要素信息工具2.3 屬性表3. 照片原數據編輯1. 航線信息瀏覽 打開globalmapper軟件,加載無人機航測…

Spring Boot 2.7.0發布,2.5停止維護

這幾天是Spring版本日,很多Spring工件都發布了新版本, Spring Framework 6.0.0 發布了第 4 個里程碑版本,此版本包含所有針對 5.3.20 的修復補丁,以及特定于 6.0 分支的 39 項修復和改進。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航測內業數據處理中的應用舉例

Globalmapper在航測內業數據處理中的應用舉例索引。 文章目錄 1. 圖像及航線瀏覽2. 3D重建3. 點云分類4. 創建地形5. 地形分析1. 圖像及航線瀏覽 擴展閱讀:【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用) 2. 3D重建 從Global Mapper的19版本開始,Pixels-…

移動工具V和選區工具M

移動工具快捷鍵:V 屬性: 自動選擇 在默認情況下,移動工具的“自動選擇”一項是沒有勾選的。表示只能選中圖層窗口中選定的固定圖層,不能隨意的點擊選擇別的圖層。在這里,我們也勾選“自動選擇”,可任意選擇…

SeleniumWebDriver擴展插件開發

Selenium WebDriver 是一組開源 API,用于自動測試 Web 應用程序,利用它可以通過代碼來控制chrome edge等瀏覽器!有時候我們需要mock接口的返回,或者攔截和轉發請求,今天就來實現這個功能本插件代碼已開源:h…

ZooKeeper的工作原理

ZooKeeper是一個分布式的應用程序協調服務。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab(Zookeeper Atomic Broadcast)協議。Zab協議有兩種模式,它們分別是恢復模式(…

memcache的學習路線圖

memcache學習材料//memcache自帶的github 上的 wiki//席劍飛 Memcache(MC)系列 1~8系列評注: memcache系統寫的最深的一博客,建議一讀。http://blog.csdn.net/xifeijian/article/details/21994941//mysql與memcache的使用https://…

[轉]錢嶺:別擔心“35歲危機”,要成為“老專家”

從清華大學到貝爾實驗室,再到中國移動,作為“IT老人”,錢嶺的技術人生幾乎覆蓋了20世紀90年代至今的信息產業革命。2007年開始,錢嶺在中國移動經歷了基礎科研到產品落地,再到團隊孵化;也經歷了云計算從無到…

【GIS前沿】周成虎院士:GIS的大數據時代展望(PPT分享)

本文源自微信公眾號:宋關福GIS筆記。版權歸原作者及刊載媒體所有,如有侵權請立即與我們聯系,我們將及時處理。更多GIS前言技術,請關注《GIS前言》專欄。 GIS的大數據時代展望

DataV:可視化大屏展示神器實戰分享

由于公司年即將發布新的產品,傳統意義上的PPT顯得不太生動化,所以想采用具體化,可視化的數據大屏進行業務數據的事實展示,第一時間想到了來自于阿里云旗下的DataV,廢話不多說,老司機開始發牌照!…

數據庫性能系列之索引(中)

GOOD NIGHT前言上一篇中,我們已經了解到了索引的基本概念和一些用法。那索引為什么會提升查詢的速度,以及索引究竟是怎么工作的呢?也許大家心里還是有一些迷茫,這一切,還要從索引背后的算法說起。GOOD NIGHT概述大家知…

微服務架構的設計原則和核心話題

目錄 一、前言 二、微服務架構的設計原則 1.拆分足夠微 2.輕量級通信 3.單一職責原則 4.領域驅動原則 三、微服務架構的核心話題 1.服務拆分 2.服務注冊與發現 3.負載均衡 4.API網關 5.服務部署與發布 四、總結 一、前言 毫無疑問,微服務架構的設計原…

4.3.2 基于集合的操作

在SQL Server處理select命令時,會在內存中建立一個結構,以返回結果集。這個結構實質上是一個有行和列的二維數組,稱為“游標(cursor)”。“游標”這個詞是“CURrent set of Records(當前記錄集)”的縮寫。它表示從表或…

Golang GOPATH 包

2019獨角獸企業重金招聘Python工程師標準>>> Golang GOPATH & 包的定義 & 包的導入 GOPATH 設置 go 命令依賴一個重要的環境變量:$GOPATH 可以在 .zshrc 配置文件中加上一行這樣的配置, export GOPATH/Users/flyme/mygo Go從1.1版本到…

PPK大疆無人機應用教程

文章目錄 一、新建項目二、導入數據三、解算過程四、結果導出一、新建項目 新建工程,設置項目名稱,保存位置,控制等級,坐標系統(坐標系統選擇高斯克呂格,中央子午線根據實際數據所在位置進行選擇) 二、導入數據 選擇大疆數據,找到對應的文件夾 數據有:圖片,EVENT.b…

Eclipse Add generated serial version ID報錯解決方案

為什么80%的碼農都做不了架構師?>>> 問題: The following problem occurred:Could not find class file.Make sure the file is compilable 解決方案: 1、右鍵項目 -> Java Build Path -> Source 在Sourcd folders on bui…

開啟線程的方式

1、實現Runnable接口 1 package test;2 3 4 5 public class ThreadTest implements Runnable{6 public void tt(){7 Thread t new Thread(this);8 t.start();9 } 10 11 Override 12 public void run() { 13 while(true){ 14 …

C# WPF設備監控軟件(經典)-上篇

01—前言應老東家也是老同學的需求,開發了此設備監控軟件。主要是為了應對測試設備長時間不上傳測試數據未能及時發現的問題,測試數據一般在每臺設備都有個固定的臨時存放目錄,測試數據不更新時,此文件夾便不再更新。需求相對比較…

[轉]微服務的4個設計原則和19個解決方案

目錄 一、微服務架構演進過程 二、微服務架構的好處 三、微服務應用4個設計原則 1.AKF拆分原則 2.前后端分離 3.無狀態服務 4.Restful通信風格 四、微服務架構帶來的問題 五、微服務平臺的19個落地實踐 1.企業IT建設的三大基礎環境 2.微服務應用平臺總體架構 3.微服…