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