經常看到有小伙伴在討論 JPA 和 MyBatis 這兩個孰優孰劣的問題,其實松哥覺得這是一個偽命題,沒必要為這種問題爭個面紅耳赤,每種框架有它存在的道理,也有各自擅長的事情,今天松哥就和大家來聊聊這兩個框架,順便來了解一下大家在開發中都用的是哪一個數據庫框架?
以下內容,松哥盡量保持一個客觀中立立場,大家不要噴我,說的不完善的地方大家可以留言補充。
JPA
JPA是什么
Java Persistence API:用于對象持久化的 API
Java EE 5.0 平臺標準的 ORM 規范,使得應用程序以統一的方式訪問持久層?
JPA和Hibernate的關系
JPA 是 Hibernate 的一個抽象(就像JDBC和JDBC驅動的關系);
JPA 是規范:JPA 本質上就是一種 ORM 規范,不是ORM 框架,這是因為 JPA 并未提供 ORM 實現,它只是制訂了一些規范,提供了一些編程的 API 接口,但具體實現則由 ORM 廠商提供實現;
Hibernate 是實現:Hibernate 除了作為 ORM 框架之外,它也是一種 JPA 實現
從功能上來說, JPA 是 Hibernate 功能的一個子集
JPA的供應商
JPA 的目標之一是制定一個可以由很多供應商實現的 API,Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的實現,JPA 供應商有很多,常見的有如下四種:
1.Hibernate
JPA 的始作俑者就是 Hibernate 的作者,Hibernate 從 3.2 開始兼容 JPA。
2.OpenJPA
OpenJPA 是 Apache 組織提供的開源項目。
3.TopLink
TopLink 以前需要收費,如今開源了。
4.EclipseLink
JPA的優勢
標準化: 提供相同的 API,這保證了基于JPA 開發的企業應用能夠經過少量的修改就能夠在不同的 JPA 框架下運行。
簡單易用,集成方便: JPA 的主要目標之一就是提供更加簡單的編程模型,在 JPA 框架下創建實體和創建 Java 類一樣簡單,只需要使用 javax.persistence.Entity 進行注解;JPA 的框架和接口也都非常簡單。
可媲美JDBC的查詢能力: JPA的查詢語言是面向對象的,JPA定義了獨特的JPQL,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。
支持面向對象的高級特性: JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,最大限度的使用面向對象的模型
....
JPA包含的技術
ORM 映射元數據:JPA 支持 XML 和 JDK 5.0 注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中。
JPA 的 API:用來操作實體對象,執行CRUD操作,框架在后臺完成所有的事情,開發者從繁瑣的 JDBC 和 SQL 代碼中解脫出來。
查詢語言(JPQL):這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序和具體的 SQL 緊密耦合。
MyBatis
什么是 MyBatis
MyBatis 也是一個 Java 持久化框架,它通過 XML 描述符或 Annotation 把對象與存儲過程或SQL語句關聯起來。與 JPA 這種對象關系映射(ORM)框架不同,MyBatis 并沒有將 Java 對象與數據庫表關聯起來,而是將 Java 方法與 SQL 語句關聯。MyBatis 允許用戶充分利用數據庫的各種功能,例如存儲過程、視圖、各種復雜的查詢以及某數據庫的專有特性,其實 MyBatis 最吸引松哥的地方就是完全控制 SQL 的執行。
與 JDBC 相比,MyBatis 簡化了查詢結果映射:SQL 語句在一行代碼中就能執行。MyBatis 提供了一個映射引擎,聲明式的把 SQL 語句執行結果與對象樹映射起來。通過使用一種內建的類 XML 表達式語言,或者使用 Apache Velocity 集成的插件,SQL 語句可以被動態的生成,這些特性都可以使開發者更方便的使用 MyBatis。MyBatis 也支持聲明式數據緩存,當一條SQL語句被標記為“可緩存”后,首次執行它時從數據庫取得的所有數據會被存儲在一段高速緩存中,今后執行這條語句時就會從高速緩存中讀取結果,而不是再次命中數據庫。
MyBatis 優勢
上手容易,也更加容易掌握。
由于自己掌握 SQL ,因此可以寫出更加優質的 SQL ,提高 SQL 的執行效率。
多表關聯查詢時,MyBatis 要靈活一些,也更具備優勢。
.....
怎么用
關于這兩個框架的用法,松哥在公眾號都寫過專門的文章介紹,讀者可以翻一下歷史記錄,三年前還在 CSDN 寫過一個 MyBatis 專欄,有興趣的小伙伴可以去松哥專欄看看。
你用哪個
最后松哥來做一個小小的調查,看看大家在開發中用的哪個?
大家也可以留言說說自己項目中用了哪一個數據持久化框架,出于什么樣的考慮用了該框架?



往期文章一覽
1、工作之余,你是怎么提高技術的?
2、兩年了,我寫了這些干貨!
3、想和大家談一點合作
4、一個Java程序猿眼中的前后端分離以及Vue.js入門
5、跟著平臺混了四年,現在要單飛了!
