摘要:Hibernate是一個(gè)面向Java環(huán)境的對(duì)象/關(guān)系數(shù)據(jù)庫(kù)映射工具。對(duì)象/關(guān)系數(shù)據(jù)庫(kù)映射(ORM))這個(gè)術(shù)語(yǔ)表示一種技術(shù),用來(lái)把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中去。Hibernate不僅僅管理Java類到數(shù)據(jù)庫(kù)表的映射(包括Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時(shí)人工使用SQL和JDBC處理數(shù)據(jù)的時(shí)間。本文將Hibernate開源框架數(shù)據(jù)庫(kù)的持久化訪問和JDBC技術(shù)從多個(gè)方面進(jìn)行了對(duì)比分析。
關(guān)鍵詞:數(shù)據(jù)持久化;JDBC;Hibernate;對(duì)比分析
一、Hibernate 技術(shù)
Hibernate技術(shù)Hibernate是一個(gè)開放源代碼的、面向Java環(huán)境的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得程序員可以隨心所欲地使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合。
Hibernata通過(guò)創(chuàng)建映射信息處理數(shù)據(jù)關(guān)系。即系統(tǒng)中每一個(gè)類與其對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)信息。映射文檔是用來(lái)定義持久數(shù)據(jù)和在需要時(shí)保存關(guān)于對(duì)象的持久域、關(guān)聯(lián)、子類和代理的XML文檔。Hibernate核心接口一共有5個(gè),分別為:Session、SessionFactory、Transaction、Query和Configuration。Session接口負(fù)責(zé)執(zhí)行與數(shù)據(jù)庫(kù)的交流,包含了很多常見的SQL語(yǔ)句;SessionFaetory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象;Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,只有在編寫自己的底層事務(wù)處理代碼時(shí)才需要;Query接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢;Configuration接口負(fù)責(zé)配置并啟動(dòng)Hibernate,創(chuàng)建SessionFaetory對(duì)象。
在實(shí)際應(yīng)用中,由于Session對(duì)象是非線程安全的,為了避免l葉J現(xiàn)并發(fā)性問題,將Session對(duì)象放人ThreadLocal中的變量。然后創(chuàng)建Configuration類的實(shí)例,它的構(gòu)造方法是將配置信息(Hibernate config.xm1)瀆入到內(nèi)存。一個(gè)Configuration實(shí)例代表Hibernate所有Java類到Sql數(shù)據(jù)庫(kù)映射的集合。接著創(chuàng)建SessionFactory實(shí)例,從SessionFaetory中取得Session的實(shí)例。可將Session看作是介于數(shù)據(jù)庫(kù)連接與事務(wù)管理的一種中問接口,它提供了對(duì)數(shù)據(jù)庫(kù)進(jìn)行持久化的一些方法。Hibernate在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作之前,必須先取得Session實(shí)例,相當(dāng)于JDBC在對(duì)數(shù)據(jù)庫(kù)操作前取得Connection實(shí)例 。
二、JDBC技術(shù)
Java應(yīng)用程序訪問數(shù)據(jù)庫(kù)的最直接的方式就是直接訪問JDBC API。JDBC是Java Database Connectivity的縮寫。JDBC是一種可用于執(zhí)行SQL語(yǔ)句的Java API,它是由一些Java的類和接13組成的。在JDBC這種方式下,接口和實(shí)現(xiàn)相分離,Java程序B為運(yùn)行了HibernateTest.java后的數(shù)據(jù)庫(kù)數(shù)據(jù))設(shè)計(jì)人員利用JDBC接1:3進(jìn)行數(shù)據(jù)庫(kù)訪問操作。而實(shí)際上對(duì)數(shù)據(jù)庫(kù)操作南JDBC驅(qū)動(dòng)程序中的接口實(shí)現(xiàn)類完成。通過(guò)使用JDBC,程序人員可以很方便地將SQL語(yǔ)言傳給具有JDBC驅(qū)動(dòng)程序的任何一種數(shù)據(jù)庫(kù)。
簡(jiǎn)單地說(shuō),JDBC可以完成3件事:一是與數(shù)據(jù)庫(kù)建立連接;二是發(fā)送SQL語(yǔ)句;i是處理結(jié)果。
三、對(duì)比分析
JDBC與Hibernate在性能上相比,JDBC靈活性有優(yōu)勢(shì)。而Hibernate在易學(xué)性,易用性上有些優(yōu)勢(shì)。當(dāng)用到很多復(fù)雜的多表聯(lián)查和復(fù)雜的數(shù)據(jù)庫(kù)操作時(shí),JDBC有優(yōu)勢(shì)。總體對(duì)比分析如下:
1.?dāng)?shù)據(jù)庫(kù)操作
相同點(diǎn):兩者都是JAVA的數(shù)據(jù)庫(kù)操作中間件。兩者對(duì)于數(shù)據(jù)庫(kù)進(jìn)行直接操作的對(duì)象都不是線程安全的,都需要及時(shí)關(guān)閉。兩者都可以對(duì)數(shù)據(jù)庫(kù)的更新操作進(jìn)行顯式的事務(wù)處理。
不同點(diǎn):使用的SQL語(yǔ)言不同:JDBC使用的是基于關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)SQL語(yǔ)言,Hibernate使用的是HQL(Hibernate query language)語(yǔ)言。操作的對(duì)象不同:JDBC操作的是數(shù)據(jù),將數(shù)據(jù)通過(guò)SQL語(yǔ)句直接傳送到數(shù)據(jù)庫(kù)中執(zhí)行,Hibernate操作的是持久化對(duì)象,由底層持久化對(duì)象的數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中。數(shù)據(jù)狀態(tài)不同:JDBC操作的數(shù)據(jù)是“瞬時(shí)”的,變量的值無(wú)法與數(shù)據(jù)庫(kù)中的值保持一致,而Hibernate操作的數(shù)據(jù)是可持久的,即持久化對(duì)象的數(shù)據(jù)屬性的值是可以跟數(shù)據(jù)庫(kù)中的值保持一致的。
2.JDBC與Hibernate讀取性能
(1)JDBC仍然是最快的訪問方式,不論是Create還是Read操作,都是JDBC快。
(2)Hibernate使用uuid.hex構(gòu)造主鍵,性能稍微有點(diǎn)損失,但是不大。
(3)Create操作,JDBC在使用批處理的方式下速度比Hibernate快,使用批處理方式耗用JVM內(nèi)存比不使用批處理方式要多得多。
(4)讀取數(shù)據(jù),Hibernate的Iterator速度非常緩慢,因?yàn)樗敲看蝞ext的時(shí)候才去數(shù)據(jù)庫(kù)取數(shù)據(jù),這一點(diǎn)從觀察任務(wù)管理器的java進(jìn)程占用內(nèi)存的變化也可以看得很清楚,內(nèi)存是幾十K幾十K的增加。
(5)讀取數(shù)據(jù),Hibernate的List速度很快,因?yàn)樗且淮涡园褦?shù)據(jù)取完,這一點(diǎn)從觀察任務(wù)管理器java進(jìn)程占用內(nèi)存的變化也可以看得很清楚,內(nèi)存幾乎是10M的10M的增加。
四、總結(jié)
兩種技術(shù)的比較可見JDBC與Hibernate功能上一樣。Hibernate其實(shí)就是基于JDBC的。封裝了JDBC底層數(shù)據(jù)訪問的細(xì)節(jié)。它們的相同點(diǎn)則體現(xiàn)在都是數(shù)據(jù)庫(kù)操作的中間件,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的對(duì)象都不是線程安全的,都需要及時(shí)地關(guān)閉;都可以對(duì)數(shù)據(jù)庫(kù)的更新操作進(jìn)行顯示的事務(wù)處理。JDBC中繁瑣的代碼問題。在多表連接、表問級(jí)聯(lián)方面也有其優(yōu)越性,使用Hibernate可以實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)操作,簡(jiǎn)化開發(fā),方便維護(hù),進(jìn)行項(xiàng)目的耦合。JDBC也具有其自身的優(yōu)點(diǎn),在性能上,其靈活性有優(yōu)勢(shì),很復(fù)雜的多表聯(lián)查和復(fù)雜的數(shù)據(jù)庫(kù)操作時(shí),JDBC亦將體現(xiàn)出其自身的優(yōu)秀性。