1. 程式人生 > >Hibernate學習(1)簡單介紹

Hibernate學習(1)簡單介紹

清理緩存 並發 connect upgrade 定義 之前 對象 value cat

1.什麽是Hibernate?

????????? 首先,Hibernate是數據持久層的一個輕量級框架。數據持久層的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等。

????????? 而且Hibernate是一個開源的orm(object relations mapping)框架。提供了查詢獲取數據的方法。用面向對象的思想來操作數據庫。節省了我們開發處理數據的時間。

2.那使用Hibernate的長處呢?

????????? 1.使用簡單介紹的hql語句(Hibernate query language)。能夠不使用傳統的insert,update等sql語句。比方insert一個對象。原來的做法是:insert into 表名稱 alue(值1,值2,值3,……)。而如今的做法是:save(對象)。

????????? 2.使用or映射。對象到關系數據庫之間的映射。

是從對象的角度操作數據庫,再次體現了面向對象思想。原來的實體抽取方法:首先有了表,然後表映射實體對象。而如今Hibernate做法是:直接由對象映射到表。

????????? 3.沒有侵入性,移植性比較好。什麽是沒有侵入性?就是Hibernate採用了pojo對象。所謂的pojo對象就是沒有繼承Hibernate類或實現Hibernate接口。

這種話,此類就是一個普通的java類,所以移植性比較好。

??

???????? 4.支持透明持久化。透明是針對上層而言的。三層架構的理念是上層對下層的依賴,僅僅是依賴接口不依賴具體實現。而Hibernate中的透明是指對業務邏輯層提供了一個接口session,而其它的都封裝隱藏。持久化是指把內存中的數據存放到磁盤上的文件裏。

3.當然一個事物,不可能十全十美。即使如此優秀的Hibernate也有自己的弱點。比方:若是大量數據批量操作。則不適合使用Hibernate。

而且一個持久化對象不能映射到多張表中。

4.Hibernate中核心5個接口

???????1.Configuration接口:負責配置及啟動Hibernate,用來創建sessionFactory

???????2.SessionFactory接口:一個SessionFactory相應一個數據源存儲。也就是一個數據庫相應一個SessionFactory。

SessionFactory用來創建Session對象。而且SessionFactory是線程安全的,能夠由多個線程訪問SessionFactory共享。

???????3.Session接口:這個接口是Hibernate中經常使用的接口,主要用於對數據的操作(增刪改查)。而這個Session對象不是線程安全的。不能共享。

???????4.Query接口:用於數據庫的查詢對象。

???????5.Transaction接口:Hibernate事務接口。它封裝了底層的事務操作,比方JTA(;java transcation architecture)全部的數據操作。比方增刪改查都寫在事務中。



那我們看一下hibernate中總體的內容:

技術分享圖片

???我們一一介紹當中的內容。

  1. Hibernate出現的原因上篇博客已經介紹。能夠參考《Hibernate介紹》
  2. Hibernate中的核心五大接口,在上篇博客中也已經介紹,能夠參考《Hibernate介紹》
  3. 怎樣搭建Hibernate,請參考《八步具體解釋Hibernate的搭建及使用》
  4. 持久化對象的三種狀態。

分別為:瞬時狀態(Transient)。持久化狀態(Persistent)。離線狀態(Detached)。三種狀態下的對象的生命周期例如以下:

技術分享圖片

三種狀態的差別是:瞬時狀態的對象:沒有被session管理。在數據庫沒有;持久化狀態的對象:被session管理,在數據庫存在,當屬性發生改變,在清理緩存時。會自己主動和數據庫同步。離線狀態:沒有被session管理,可是在數據庫中存在。

5.測試工具Juit

測試類須要繼承TestCase。編寫單元測試方法。方法名稱必須為test開頭。方法沒有參數沒有返回值,採用public修飾。當中在測試中,查詢對象時,使用get或者load兩種方法進行載入,這個方案的差別:get不支持延遲載入。而load默認情況下是支持延遲載入。而且get查詢對象不存在時。返回null;而load查詢對象不存在時,則拋出ObjectNotFoundException異常。

6.悲觀鎖和樂觀鎖解釋。

悲觀鎖為了解決並發性。跟操作系統中的進程中加入鎖的概念一樣。就是在整個過程中在事務提交之前或回滾之前,其它的進程是無法訪問這個資源的。悲觀鎖的實現方式有兩種:一種使用數據庫中的獨占鎖。還有一種是在數據庫加入一個鎖的字段。hibernate中聲明鎖例如以下:

Account account = (Account)session.get(Account.class, 1, LockMode.UPGRADE);而net.sf.hibernate.LockMode類表示鎖模式。當取值LockMode.UPGRADE時,則表示使用悲觀鎖for update。而樂觀鎖是為了解決版本號沖突的問題。就是在數據庫中加入version字段。每次更新時,則把自己的version與數據庫中的version進行比較,若是版本號相比較低。則不同意進行改動更新。

7.H ibernate中的緩存機制。

緩存是什麽呢?緩存是應用程序和數據庫之間的內存的一片區域。

基本的目的是:為了降低對數據庫讀取的時間。

當查詢數據時,首先在緩存中查詢,若存在。則直接取出,若不存在,然後再向數據庫中查詢。

所以應該把經常訪問數據庫的數據放到緩存中。至於緩存中的數據怎樣不斷的置換。這也須要涉及一種淘汰數據的算法。

談到這個hibernate中的緩存,你想到了什麽呢?剛才敘述緩存時。是否感覺非常熟悉。感覺從哪也聽過似的。嗯呢,是呢。是非常熟悉,寫著寫著就非常熟悉。這個剛才的緩存以及緩存的置換算法就和計算機組成中的cache相似。

好吧,來回到我們hibernate中的緩存。

hibernate中的緩存能夠分為兩種:一級緩存,也稱session緩存;二級緩存。是由sessionFactory管理。

那一級緩存和二級緩存有什麽差別呢?差別的關鍵關於:緩存的生命周期,也就是緩存的範圍不同。

那首先介紹一下緩存的生命周期,也就是緩存的範圍。

1.事務緩存,每一個事務都有自己的緩存,當事務結束。則緩存的生命周期相同結束,正如上篇博客中我們提到,對數據庫的操作,增刪改查都是放到事務中的。和事務保持同步,若是事務提交完成,通常是不同意是再次對數據庫進行操作。

所以session是屬於事務緩存的。

2.應用緩存,一個應用程序中的緩存,也就是應用程序中的全部事務的緩存。

僅僅有當應用程序結束時。此時的緩存的額生命周期結束。二級緩存就是應用緩存。

3.集群緩存。被一臺機器或多臺機器的進程共享。

這下明確了一級緩存和二級緩存的差別了吧。

那一級緩存和二級緩存的共同點是:都是緩存實體屬性。

二級緩存普通情況都是由第三方插件實現的。第三方插件如:

EHCache,JbossCache(是由Jboss開源組織提供的)。osCache(open symphony)swarmCache

前三種對hibernate中的查詢緩存是支持的,後一種是不支持hibernate查詢緩存。

那什麽是hibernate查詢緩存呢?

查詢緩存是用來緩存普通屬性的,對於實體對象而言,是緩存實體對象的id



在了解Hibernate之前,我們先回想一下傳統JDBC訪問數據庫的相關內容。重點在於分析JDBC訪問存在哪些缺陷,這些缺陷在Hibernate中是怎樣思考和解決的

JDBC主要對象

?? ? ?DriveManager:代表驅動程序管理器,負責創建數據庫連接
?? ? ?Connection:代表數據庫連接
?? ? ?Statement:負責運行SQL語句
?? ? ?PrepareStatement:繼承Statement,負責運行SQL語句,具有提前定義SQL語句的功能

?? ? ?Result:代表SQL查詢語句的查詢結果集


JDBC訪問步驟

?? ? ?1、載入並註冊驅動JDBC驅動程序
?? ? ?2、建立數據庫連接
?? ? ?3、創建Statement對象。並準備運行SQL語句
?? ? ?4、運行SQL語句

?? ? ?5、依次關閉Statement和Connection對象


JDBC缺陷

?? ? ?1、編程人員既要懂Java語言。又要懂SQL語言。才幹編寫數據庫訪問代碼
?? ? ?2、程序代碼中嵌入大量字符串形式點的SQL語句,降低了程序代碼的獨立性和可讀性
?? ? ?3、程序代碼與關系數據庫結構綁定在一起,削弱了程序代碼的獨立性和可靠性。例:數據庫表改動了一個字段名。那麽程序代碼中涉及的SQL語句也要進行改動
?? ? ?4、編程人員須要了解,對象和表、屬性和字段相應關系。因此編程人員即須要熟悉對象模型,又須要懂得關系數據庫,還要了解兩者的相應關系,所以編程人員不能依照全然面向對象的思維來編敲代碼代碼

??? ? ?了解JDBC訪問數據庫的缺陷之後。我們接下來會做一個簡單的演示樣例,並針對此演示樣例分析一下,Hibernate的運行步驟和怎樣解決JDBC帶來的缺陷。

?

Hibernate學習(1)簡單介紹