【转】JPA、Hibernate和Mybatis区别和总结
很多人都用過java的數(shù)據(jù)庫連接池C3P0,但官方?jīng)]有說明名稱的由來。
據(jù)傳聞:連接池作者是《星球大戰(zhàn)》迷,C3P0就是其中的一個機(jī)器人,并且這個名稱中包涵connection 和pool的單詞字母。因此叫這個名字(根據(jù)網(wǎng)友提醒,機(jī)器人的名字為C3PO,這里應(yīng)該是附會了)。
?
C3P0就是下圖中的右邊的那個機(jī)器人。左邊是他哥哥R2D2。
一、JPA 概述
1. Java Persistence API(Java 持久層 API):用于對象持久化的 API
2. 作用:使得應(yīng)用程序以統(tǒng)一的方式訪問持久層
3. 前言中提到了 Hibernate,那么JPA 與 Hibernate究竟是什么關(guān)系呢:
1)JPA 是 Hibernate 的一個抽象,就像 JDBC 和 JDBC 驅(qū)動的關(guān)系
2)JPA 是一種 ORM 規(guī)范,是 Hibernate 功能的一個子集?(既然 JPA 是規(guī)范,Hibernate 對 JPA 進(jìn)行了擴(kuò)展,那么說 JPA 是 Hibernate 的一個子集不為過)
3)Hibernate 是 JPA 的一個實現(xiàn)
4. JPA 包括三個方面的技術(shù):
1)ORM 映射元數(shù)據(jù),支持 XML 和?JDK?注解兩種元數(shù)據(jù)的形式
2)JPA 的 API
3)查詢語言:JPQL
?
hibernate是持久化實現(xiàn)技術(shù),而jpa是持久化的標(biāo)準(zhǔn),一個是具體實現(xiàn),一個是接口協(xié)議,當(dāng)然springdata jpa是在hibernate的基礎(chǔ)上更上層的封裝實現(xiàn)。
目前比較成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager、Oracle 捐獻(xiàn)給 Eclipse 社區(qū)的 EclipseLink、Apache 的 OpenJPA 等。
?
?
?
一、應(yīng)用場合:
傳統(tǒng)公司、部分個人開發(fā)者喜歡用jpa;而互聯(lián)網(wǎng)公司更青睞于mybatis
原因:
1、mybatis更加靈活,開發(fā)迭代模式?jīng)Q定了他是互聯(lián)網(wǎng)公司的首先;每一次的修改不會帶來性能上的下降。
2、傳統(tǒng)公司需求迭代速度慢、項目改動小,hibernate可以做到一勞永逸;hibernate容易因為添加關(guān)聯(lián)關(guān)系或者開發(fā)者不了解優(yōu)化導(dǎo)致項目,造成越改越糟糕。
二、各自特點:
1、mybatis官方文檔就說了他是一個半自動化的持久層框架,相對于按自動的hibernate更加靈活可控;
2、mybatis的學(xué)習(xí)成本低于hibernate。
3、使用hibernate需要對他有深入的了解,尤其是緩存方面,作為一個持久層框架,性能還是第一位的。
hibernate具有三級緩存,一級緩存默認(rèn)是開啟的,二級緩存需要手動開始并配置優(yōu)化,三級緩存可以整合業(yè)界流行的緩存技術(shù):redis,ecache等等。
4、hibernate在關(guān)聯(lián)查詢中的懶加載。(在開發(fā)中,還是不建議去過多使用外鍵去關(guān)聯(lián)操作)
5、jpa是一種規(guī)范,hibernate也是遵從這種規(guī)范;
6、springDataJpa是對repository的封裝,簡化了repository的操作。
?
?
使用了一段時間jpa,而mybatis是之前一直在用的,不說區(qū)別是啥,因為有很多人比較這兩個框架了!?
從國內(nèi)開源的應(yīng)用框架來看,國內(nèi)使用jpa做orm的人還是比較少,如果換成hibernate還會多一些,所以面臨的風(fēng)險可能就是你會用,和你合作的人不一定會用,如果要多方協(xié)作,肯定要考慮這個問題!?
靈活性方面,jpa更靈活,包括基本的增刪改查、數(shù)據(jù)關(guān)系以及數(shù)據(jù)庫的切換上都比mybatis靈活,但是jpa門檻較高,另外就是更新數(shù)據(jù)需要先將數(shù)據(jù)查出來才能進(jìn)行更新,數(shù)據(jù)量大的時候,jpa效率會低一些,這時候需要做一些額外的工作去處理!?
?
1.相對來說,jpa的學(xué)習(xí)成本比mybatis略高?
2.公司業(yè)務(wù)需求頻繁變更導(dǎo)致表結(jié)構(gòu)復(fù)雜,此處使用mybatis比jpa更靈活?
3.就方言來講,一般公司選定數(shù)據(jù)庫后再變更微乎其微,所以此處方言的優(yōu)勢可以忽略
?
很多人青睞 Mybatis ,原因是其提供了便利的 SQL 操作,自由度高,封裝性好……SpringData JPA對復(fù)雜 SQL 的支持不好,沒有實體關(guān)聯(lián)的兩個表要做 join ,的確要花不少功夫。
?
談起操作數(shù)據(jù)庫,大致可以分為幾個階段:首先是 JDBC 階段,初學(xué) JDBC 可能會使用原生的 JDBC 的 API,再然后可能會使用數(shù)據(jù)庫連接池,比如:c3p0、dbcp,還有一些第三方工具,比如 dbutils 等,樓主認(rèn)為 JDBC 是貫穿始終的,即使到了框架部分,也會對 JDBC 進(jìn)行整合,此階段還是自己手寫 SQL 語句;下一個階段就是 Hibernate,大家體會到了操作數(shù)據(jù)庫可以不用自己手動編寫 SQL,調(diào)用 Hibernate 提供的 API 即可。
?
?
?
(文章借用了其他幾篇博客中的內(nèi)容,因為是初學(xué)者,許多概念性的關(guān)系自己不能完全理解,就將大神的搬了過來,如有不當(dāng),可留言,本人自會妥善處理,謝謝)
在學(xué)習(xí)框架的過程中,發(fā)現(xiàn)學(xué)的東西很多,但是感覺他們之間的聯(lián)系區(qū)別都不是很了解,知道JPA可以去實現(xiàn)持久化數(shù)據(jù)到數(shù)據(jù)庫當(dāng)中,Hibernate也有這樣的功能,總以為他們之間是一種平級的關(guān)系,擁有同樣的作用,是一種可以相互替代的關(guān)系,就像你吃飯時,選擇吃米飯和吃面條一樣,然而,在進(jìn)行了一番搜索之后,發(fā)現(xiàn)并不是那么回事兒。
JPA本身是一種規(guī)范,它的本質(zhì)是一種ORM規(guī)范(不是ORM框架,因為JPA并未提供ORM實現(xiàn),只是制定了規(guī)范)因為JPA是一種規(guī)范,所以,只是提供了一些相關(guān)的接口,但是接口并不能直接使用,JPA底層需要某種JPA實現(xiàn),JPA現(xiàn)在就是Hibernate功能的一個子集
Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的?JPA(Java??Persistence API) 兼容認(rèn)證。JPA和Hibernate之間的關(guān)系,可以簡單的理解為JPA是標(biāo)準(zhǔn)接口,Hibernate是實現(xiàn),并不是對標(biāo)關(guān)系,借用下圖可以看清楚他們之間的關(guān)系,Hibernate屬于遵循JPA規(guī)范的一種實現(xiàn),但是JPA是Hibernate遵循的規(guī)范之一,Hibernate還有其他實現(xiàn)的規(guī)范,所以它們的關(guān)系更像是JPA是一種做面條的規(guī)范,而Hibernate是一種遵循做面條的規(guī)范的湯面,他不僅遵循了做面條的規(guī)范,同時也會遵循做湯和調(diào)料的其他規(guī)范,他們之間并不是吃面條和吃米飯的關(guān)系
1.JPA
??JPA全稱: Java Persistence API,JPA通過JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實體對象持久化到數(shù)據(jù)庫中。
??JPA的出現(xiàn)有兩個原因:
??其一,簡化現(xiàn)有Java EE和Java SE應(yīng)用的對象持久化的開發(fā)工作;
??其二,Sun希望整合對ORM技術(shù),實現(xiàn)持久化領(lǐng)域的統(tǒng)一。
?Sun之所以提出JPA規(guī)范,其目的是以官方身份來統(tǒng)一各種ORM框架的規(guī)范,包括著名的Hibernate、TopLink等
?不過JPA規(guī)范給開發(fā)者帶來了福音:開發(fā)者面向JPA規(guī)范的接口,但底層的JPA實現(xiàn)可以任意切換:覺得Hibernate好的,可以選擇Hibernate JPA實現(xiàn);覺得TopLink好的,可以選擇TopLink JPA實現(xiàn)……這樣開發(fā)者可以避免為使用Hibernate學(xué)習(xí)一套ORM框架,為使用TopLink又要再學(xué)習(xí)一套ORM框架
? JPA提供的技術(shù):
??(1)ORM映射元數(shù)據(jù)
??JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對象和表之間的映射關(guān)系,框架據(jù)此將實體對象持
??久化到數(shù)據(jù)庫表中;
??(2)JPA 的API
??用來操作實體對象,執(zhí)行CRUD操作,框架在后臺替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解
??脫出來。
??(3)查詢語言
??通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù),避免程序的SQL語句緊密耦合
2. Hibernate
??JPA是需要Provider來實現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個。
??例如:?
??(1)實體對象的狀態(tài),在Hibernate有自由、持久、游離三種,JPA里有new,managed,detached,removed,而這些狀態(tài)都是一一對應(yīng)的。
??(2)flush方法,都是對應(yīng)的,
??(3)Query query = manager.createQuery(sql),它在Hibernate里寫法上是session,而在JPA中變成了 ?manager
3. ?JPA和Hibernate之間的關(guān)系,可以簡單的理解為JPA是標(biāo)準(zhǔn)接口,Hibernate是實現(xiàn)。
??那么Hibernate是如何實現(xiàn)與JPA 的這種關(guān)系的呢?
??Hibernate主要是通過三個組件來實現(xiàn)的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。
??(1)hibernate-annotation是Hibernate支持annotation方式配置的基礎(chǔ),它包括了標(biāo)準(zhǔn)的JPA annotation以及 ?Hibernate自身特殊功能的annotation。
??(2)hibernate-core是Hibernate的核心實現(xiàn),提供了Hibernate所有的核心功能。
??(3)hibernate-entitymanager實現(xiàn)了標(biāo)準(zhǔn)的JPA,可以把它看成hibernate-core和JPA之間的適配器,它并不直接提供ORM的功能,而是對hibernate-core進(jìn)行封裝,使得Hibernate符合JPA的規(guī)范。
總的來說,JPA是規(guī)范,Hibernate是框架,JPA是持久化規(guī)范,而Hibernate實現(xiàn)了JPA。
題外的一些思考:如果拋開JPA直接使用Hibernate的注解來定義一個實例,很快發(fā)現(xiàn)了幾個問題:
????????? hibernate對jpa的支持,不是另提供了一套專用于jpa的注解。一些重要的注解如Column, OneToMany等,hibernate沒有提供,這說明jpa的注解已經(jīng)是hibernate 的核心,hibernate只提供了一些補(bǔ)充,而不是兩套注解。要是這樣,hibernate對jpa的支持還真夠足量,我們要使用hibernate注解就必定要使用jpa。
兩個額外的問題:
第一個是問如果想用hibernate注解,是不是一定會用到j(luò)pa的。網(wǎng)友的回答:“是。如果hibernate認(rèn)為jpa的注解夠用,就直接用。否則會弄一個自己的出來作為補(bǔ)充”
第二個是問,jpa和hibernate都提供了Entity,我們應(yīng)該用哪個,還是說可以兩個一起用?網(wǎng)友回答說“Hibernate的Entity是繼承了jpa的,所以如果覺得jpa的不夠用,直接使用hibernate的即可”
總結(jié)
以上是生活随笔為你收集整理的【转】JPA、Hibernate和Mybatis区别和总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈弗神兽混动DHT正式上市 不止省油这么
- 下一篇: 爷青回!经典续作《大富翁10》即将登陆主