Hibernate的系統 學習html
1、Hibernate的介紹java
首先,hibernate是數據持久層的一個輕量級框架。數據持久層的框架有不少好比:iBATIS,myBatis,Nhibernate,Siena等等。node
而且Hibernate是一個開源的orm(object relations mapping)框架,提供了查詢獲取數據的方法,用面向對象的思想來操做數據庫,節省了咱們開發處理數據的時間。mysql
2.那使用Hibernate的優勢呢?算法
1.使用簡介的hql語句(Hibernate query language)。能夠不使用傳統的insert,update等sql語句。好比insert一個對象,原來的作法是:insert into 表名稱 alue(值1,值2,值3,……),而如今的作法是:save(對象)。sql
2.使用or映射。對象到關係數據庫之間的映射。是從對象的角度操做數據庫,再次體現了面向對象思想。原來的實體抽取方法:首先有了表,而後表映射實體對象。而如今Hibernate作法是:直接由對象映射到表。數據庫
3.沒有侵入性,移植性比較好。什麼是沒有侵入性?就是Hibernate採用了pojo對象。所謂的pojo對象就是沒有繼承Hibernate類或實現Hibernate接口。這樣的話,此類就是一個普通的Java類,因此移植性比較好。 數組
4.支持透明持久化。透明是針對上層而言的。三層架構的理念是上層對下層的依賴,只是依賴接口不依賴具體實現。而Hibernate中的透明是指對業務邏輯層提供了一個接口session,而其餘的都封裝隱藏。持久化是指把內存中的數據存放到磁盤上的文件中。緩存
3.固然一個事物,不可能十全十美,即便如此優秀的Hibernate也有本身的弱點。好比:如果大量數據批量操做。則不適合使用Hibernate。而且一個持久化對象不能映射到多張表中。tomcat
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又是如何應用的呢?下篇博客將會介紹如何使用Hibernate?
看一下hibernate中總體的內容:
咱們一一介紹其中的內容。
分別爲:瞬時狀態(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。