java 持久化

名詞大作戰

什麼是JPA

JPA(Java Persistence API )中文名Java持久層API,JPA通過註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。Sun引入新的JPA ORM規範出於兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。Hibernate3.2+、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。

什麼是 Hibernate

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JaveEE架構中取代CMP,完成數據持久化的重任。

什麼是Spring Data

Spring Data 是持久層通用解決方案,支持關係型數據庫 Oracle、MySQL、非關係型數據庫NoSQL、Map-Reduce 框架、雲基礎數據服務 、搜索服務。Spring Data 就是 Spring 官方提供一套數據層綜合解決方案 !至此開發者唯一要做的,就只是聲明持久層的接口其他都交給Spring Data JPA來幫你完成!

什麼是Spring Data JPA

Spring Data JPA是Spring Data家族的一部分,該模塊處理基於JPA的數據訪問層的增強支持。這使得構建使用數據訪問技術的基於Spring的應用程序更加容易。

什麼是 MyBatis

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

什麼是JDBC

JDBC(Java DataBase Connectivity)提供一種接口,它是由各種數據庫廠商提供類和接口組成的數據庫驅動,爲多種數據庫提供統一訪問。我們使用數據庫時只需要調用JDBC接口就行了。JDBC解決java系統與數據庫建立連接、發送 操作數據庫的語句並處理結果等問題。

PK

JPA VS JDBC

JDBC解決的是java系統與數據庫底層聯通性問題,實現了對不同數據庫驅動的統一封裝,已經sql語言交互和解析的標準語言。JPA解決的是java對象建模和持久化模型的映射,以及對持久化模型的相關操作語法。絕大多數JPA實現框架在底層上還是依賴JDBC與數據庫交互,也就是說JPA並沒有取代JDBC,而是提供了高階的語法抽象。類比spring和java EE的關係,spring並沒有取代JAVA,而是提供了更便捷的語法抽象。

JPA VS Hibernate

實現路徑之爭,正規軍幹不過造反派,最終選擇收編造反派。JPA放棄了EJB2.0前提假設,借鑑了Hibernate解決方案邊界,抽象出通用的API。同時Hibernate成爲JPA的一個實現,且是最流行的實現方案。

JPA VS Spring Data

標準之爭,學術派幹不過實戰派,最終實戰派成爲事實標準,官方標準被統籌。

MyBatis VS Hibernate

設計理念之爭。MyBatis考慮的是ER數據存儲驅動的系統設計流程,先有ER關係數據庫存儲模型,然後開發JAVA代碼,controller-service-dao是標準的代碼分層。前提假設爲系統的複雜度與關注目標應該是數據存儲與sql,使用傳統重CRUD的業務系統開發,尤其適合有複雜查詢的後臺管理系統開發。與其說是一個ORM框架,不如說是SQL與java代碼的轉換工具。Hibernate考慮的是領域驅動架構,先有領域模型,然後纔有數據持久層。從Hibernate(冬眠)的含義可以發現,Hibernate設計者認爲數據存儲只是實體Entity的一個臨時狀態,春天來了實體自然就甦醒了。其前提假設是系統的複雜度與關注目標應該是業務邏輯,持久化只是一個需要稍微處理一下的一個邊界問題。

PK結論

Hibernate是JPA的一種實現;沒有Hibernate,JPA和spring data都只是空殼子,代碼沒有可執行性。Hibernate通過JDBC實現與數據庫的交互,但JDBC也是空殼子,必須依賴具體的數據庫驅動才能真正執行sql,如果DB是mysql,則需要mysql jdbc driver才能與mysql server交互。Spring Data JPA 是在JPA規範的基礎下提供了Repository層的實現,但是使用那一款ORM需要你自己去決定。在spring boot中基於spring data JPA提供了以極少編碼實現完整的CRUD的方案。
目前互聯網微服務架構主流選型是spring data JPA(Hibernate實現),實現日趨複雜的業務邏輯與持久層的解耦。如果是報表查詢密集型的系統則考慮使用MyBatis。

深入理解spring data JPA概念

Java Persistence API (JPA)提供一種標準O-R映射機制、一個執行CRUD操作的EntityManager API以及一種擴展EJB-QL以檢索實體的方式,從而標準化了面向Java平臺的持久性的使用。spring data JPA直接使用了JPA的O-R映射機制;屏蔽了執行CRUD操作的EntityManager API;基本廢棄了Java Persistence query language (JPQL) ,推薦使用Querydsl擴展來實現查詢功能。
所以我們需要了解的主要概念變成了如下內容:

  • 實體Entity:
    實體是一個輕量級持久域對象。通常,實體表示關係數據庫中的表,並且每個實體實例對應於該表中的一行。實體的主要編程構件是實體類,儘管實體可以使用助手類。實體的持久狀態通過持久字段或持久屬性表示。這些字段或屬性使用對象/關係映射註釋將實體和實體關係映射到基礎數據存儲中的關係數據。實體和實體映射主鍵都在javax.persistence包下面。
  • 倉庫Repository:
    Repository是spring data對java持久層的抽象,它提供了一種可以使用POJO領域對象持久化和CRUD的機制。spring data的Repository接口主要充當標記接口,用於捕獲要處理的實體類型,並幫助我們發現擴展這個接口的接口。

參考文檔
mybatis與springdata的一些簡單比較與思考
https://www.cnblogs.com/abcwt112/p/6945181.html
JPA官方文檔
https://docs.oracle.com/javaee/7/tutorial/persistence-intro.htm#BNBPZ
Spring Data JPA 與 MyBatis對比
https://www.jianshu.com/p/3927c2b6acc0
如何對 JPA 或者 MyBatis 進行技術選型
https://blog.csdn.net/yangsnow_rain_wind/article/details/79650616
深入瞭解 JPA - 1
http://www.cnblogs.com/crawl/p/7703679.html

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