JPA/Hibernate/Spring Data概念

springboot發表於2017-09-26

【從零開始學習Spirng Boot—常見異常彙總】

事情的起源,無意當中在一個群裡看到這麼一句描述:”有人麼?默默的問一句,現在開發用mybatis還是hibernate還是jpa”?然後大家就進行各種回答,但是沒有有質疑這句話描述的合理性,個人覺得需要清楚概念的,在這裡mybatis大家肯定是沒有什麼疑問,我們把上面那句話更改下,方便我們丟擲一些點出來,去掉mybatis修改為:“現在開發是使用hibernate還是jpa”?那麼在這裡的話,我們就要清楚hibernate/jpa/spring

data/spring data jpa到底怎麼一個關係?

什麼是JPA?

JPA全稱Java Persistence API.JPA通過JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。百度百科JPA

在上面只是一個JPA的定義,我們看看另外一段更能看出是什麼的描述:

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關係對映工具來管理Java應用中的關係資料。

在這段話就比較清晰了,這裡有一個關鍵詞“持久化規範”。我們可以拆成兩部分進行解讀“持久化”、“規範”。所謂的持久化是將程式資料在瞬時資料(比如記憶體中的資料)轉換為持久資料(比如:儲存到資料庫中,磁碟檔案…)。這個個人粗糙的描述,看看專業的描述,如下:

持久化(Persistence),即把資料(如記憶體中的物件)儲存到可永久儲存的儲存裝置中(如磁碟)。持久化的主要應用是將記憶體中的物件儲存在的資料庫中,或者儲存在磁碟檔案中、XML資料檔案中等等。

持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。

JDBC就是一種持久化機制。檔案IO也是一種持久化機制。

好了,上面已經描述很清楚了,我們在說說“規範”: 所謂的規範意指明文規定或約定俗成的標準。如:道德規範、技術規範,公司管理規範。

那麼“持久化規範”就是Sun針對持久化這一層操作指定的規範,如果沒有指定JPA規範,那麼新起的框架就隨意按照自己的標準來了,那我們開發者的世界就玩完了,我們就沒法把我們的經歷全部集中在我們的業務層上,而是在想我們進行相容了,這種情況有點像Android開發,Android本身有官方的SDK,但是由於SDK過於開源了,結果導致很多廠商基於SDK二次開發,但是開發完相容性就不是很好,最好的例子就是Android的頭像上傳,就是一件很煩人的事情。好了,JPA就嘮叨到這裡。

什麼是Hibernate?

這裡引用百度百科的話hibernate:

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

在上面這段描述中抓住核心的一句話就可以了“是一個全自動的ORM框架”。那麼是ORM呢? ORM是物件關係對映的意思,英語:Object Relational Mapping簡稱ORM,是一種程式技術,用於實現物件導向程式語言裡不同系統型別的系統之間的資料轉換。好了,更多的概念需要自己去挖掘,這裡只是拋裝引玉下。

什麼是Spring Data?

Spring Data是一個用於簡化資料庫訪問,並支援雲服務的開源框架。其主要目標是使得資料庫的訪問變得方便快捷,並支援map-reduce框架和雲端計算資料服務。此外,它還支援基於關係型資料庫的資料服務,如Oracle

RAC等。對於擁有海量資料的專案,可以用Spring Data來簡化專案的開發,就如Spring Framework對JDBC、ORM的支援一樣,Spring Data會讓資料的訪問變得更加方便。

在上面這段描述中我覺得核心的就是“Spring Data是用於簡化資料庫訪問,支援雲服務的開源框架”。所以Spring Data本身就是一個開源的框架。

什麼是Spring Data JPA?

我們先看一個描述:

Spring Data JPA能幹什麼

可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對資料的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。

首先我們需要清楚的是Spring Data是一個開源框架,在這個框架中Spring Data JPA只是這個框架中的一個模組,所以名稱才叫Spring

Data JPA。如果單獨使用JPA開發,你會發現這個程式碼量和使用JDBC開發一樣有點煩人,所以Spring Data JPA的出現就是為了簡化JPA的寫法,讓你只需要編寫一個介面繼承一個類就能實現CRUD操作了。

JPA/Hibernate關係?

我們先看下別人的描述:

Jpa是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的toplink),OpenJPA等可供選擇,所以使用Jpa的一個好處是,可以更換實現而不必改動太多程式碼。

從上面這個描述,我們能就是能看出: JPA定義了一個規範,Hibernate是其中的一種實現方式可以,所以我們可以說:Hibernate是JPA的一種實現方式。但是這麼說就有點欠妥當了:開發是使用hibernate還是jpa。如果你回答使用JPA的話,那麼你根本做不了什麼事情,因為你需要使用它具體的一種實現方式,比如:Hibernate,EclipseLink,toplink。如果回答說是使用Hibernate的話,還勉強說的過去,但是在Hibernate中也有JPA的影子。但是這裡不要造成一個誤解,hibernate一定依賴JPA什麼之類的,JPA現在只是Hibernate功能的一個子集。Hibernate從3.2開始,開始相容JPA的。Hibernate3.2獲得了Sun

TCK的JPA(JavaPersistence API)相容認證。

那麼我們在描述的時候,別人問你持久化具體使用了什麼,我們可以說:使用了基於Hibernate實現的JPA,或者是Hibernate JPA,那麼加上spring data的,我們一般都簡化說:spring data jpa,一般預設的就是使用了hibernate進行實現,現在網上這方面的資料也比較多,可能就約定俗成了。當然你要別人清楚的話,可以自己在進行補充下。

好了,這個困惑就到這裡,在這裡就是博主個人的一些見解,有什麼個別的見解都可以在評論中探討,如有錯誤之處,請指正。

這篇也是博主花了一些心血去梳理的,請大家都都支援。

視訊+交流平臺:

àSpring Boot網易雲課堂視訊

study.163.com/course/intr…

àSpring Boot交流平臺

412887952-qq-com.iteye.com/blog/232153…

相關文章