Hibernate筆記=>前言
Mapping(ORM),在沒有ORM的時候,開發(fā)者需要自己開發(fā)對象到數(shù)據(jù)庫的映射工作,一般來說在Java世界中是通過JDBC來實(shí)現(xiàn),在.Net世界是通過ADO.net來實(shí)現(xiàn),眾所周知這一項(xiàng)任務(wù)是繁瑣耗時的,因?yàn)橐诖a中內(nèi)置大量的SQL語句,這使得代碼的可讀性和可維護(hù)性大大降低。現(xiàn)在,Hibernate可以為我們來做這項(xiàng)工作,我們只需要配置一個Mapping文件即可,剩下的所有事情就交給Hibernate吧,這樣可以節(jié)省對象持久化相關(guān)的至少30%的JDBC/ADO.net編程工作量,這是多么的令人興奮阿。
這種結(jié)構(gòu)中,業(yè)務(wù)邏輯層不僅負(fù)責(zé)業(yè)務(wù)邏輯,而且直接訪問數(shù)據(jù)庫,提供對業(yè)務(wù)數(shù)據(jù)的增、刪、改、查的操作。為了把數(shù)據(jù)訪問的細(xì)節(jié)和業(yè)務(wù)邏輯分開,可以把數(shù)據(jù)訪問作為單獨(dú)的持久化層。重新分層后自上而下變?yōu)椋?/div>
[顯示表述層]=>[業(yè)務(wù)邏輯層]=>[持久化層]=>[數(shù)據(jù)庫層]
(1)代碼重用性高,能夠完成所有的DB訪問操作;
(2)能夠支持多種數(shù)據(jù)庫平臺;
(3)具有獨(dú)立性,持久化層的具體實(shí)現(xiàn)的變化不能影響上層的實(shí)現(xiàn)。
2、什么是ORM?
ORM(Object-Relation
Mapping)是對象-關(guān)系映射,當(dāng)下流行的開發(fā)語言都是面向?qū)ο蟮模鏙ava,C#。而當(dāng)下流行的DB大多都是面向關(guān)系的,也就是關(guān)系數(shù)據(jù)庫。這樣在面向?qū)ο笈c面向關(guān)系之間需要一個橋梁,才能使二者協(xié)同無縫聯(lián)合工作,ORM就是這個橋梁。映射關(guān)系如下:
[類]<=>[表]
[對象實(shí)例]<=>[表的行] [屬性]<=>[表的列]
Hibernate就是一個卓越的ORM中間件。
3、ORM是怎么映射的?
要把類的屬性與DB表的Field對應(yīng),ORM就必須能識別類的屬性名字和數(shù)值。這就必須才用反射(Reflection)技術(shù),相信有一定開發(fā)經(jīng)驗(yàn)的人對此技術(shù)都是耳熟能詳了吧,當(dāng)前主流開發(fā)語言都支持此技術(shù),如Java和.net,而且具體用法都如出一轍。當(dāng)然對于那些只想使用ORM而不關(guān)心ORM的具體實(shí)現(xiàn)的朋友,這些內(nèi)容不了解也沒有任何影響。這也恰恰是ORM的好處啊。
4、Hibernate采用的一個技術(shù)
當(dāng)配置為自動決定何時把對象數(shù)據(jù)寫入DB的模式下,Hibernate采用了一個自動識別對象屬性變化的技術(shù)。即Hibernate知道持久化類哪些屬性發(fā)生了變化,然后據(jù)此來決定后便的操作。關(guān)于此技術(shù)更具體的內(nèi)容,以后再詳述。
5、緩存
從內(nèi)存中獲取數(shù)據(jù)要比從DB中獲取數(shù)據(jù)快得多,所以很多ORM都采用緩存結(jié)束來提高持久化效率,Hibernate也不例外。在Session中保留所有已經(jīng)持久化的對象實(shí)例作為緩存,如果需要獲取的數(shù)據(jù)在緩存中存在,則不去DB中加載。當(dāng)然緩存中數(shù)據(jù)與DB中數(shù)據(jù)的一致性問題,Hibernate就是通過剛剛說過的[識別對象屬性變化]的技術(shù)來實(shí)現(xiàn)的。
6、什么是HQL?
HQL(Hibernate Query
Language)是Hibernate自己的查詢語句,它與SQL相似,但是HQL是面向?qū)ο蟮?,它引用類名及類的屬性名,而不是表名及表的字段名?/div>
好了,通過以上這些,基本可以了解Hibernate是什么了,可以開始了解Hibernate的核心接口了,Let's Go...
這樣持久化層封裝數(shù)據(jù)訪問細(xì)節(jié),為業(yè)務(wù)邏輯提供面向?qū)ο蟮腁PI。一個完善的持久化層應(yīng)該達(dá)到以下幾個目標(biāo):
正因?yàn)檫@幾個目標(biāo)的艱巨,在企業(yè)級開發(fā)中花費(fèi)大量的時間,采用高級相關(guān)技術(shù)工程師去重頭開發(fā)自己的持久層不是很可行的,Hibernate作為持久層中間件,它的具體實(shí)現(xiàn)對上層是透明的,開發(fā)者無需關(guān)系它的具體實(shí)現(xiàn),只需要知道如何訪問他的接口就行了。
Mapping)是對象-關(guān)系映射,當(dāng)下流行的開發(fā)語言都是面向?qū)ο蟮模鏙ava,C#。而當(dāng)下流行的DB大多都是面向關(guān)系的,也就是關(guān)系數(shù)據(jù)庫。這樣在面向?qū)ο笈c面向關(guān)系之間需要一個橋梁,才能使二者協(xié)同無縫聯(lián)合工作,ORM就是這個橋梁。映射關(guān)系如下:
[對象實(shí)例]<=>[表的行]
那么這些映射關(guān)系是如何制定的呢?——只需要一個映射文件(XML)即可,在其中配置持久化類與DB表的映射關(guān)系后,ORM中間件在運(yùn)行時參照此文件內(nèi)容,對象持久化的DB中或把DB中數(shù)據(jù)加載到持久化類中。
要把類的屬性與DB表的Field對應(yīng),ORM就必須能識別類的屬性名字和數(shù)值。這就必須才用反射(Reflection)技術(shù),相信有一定開發(fā)經(jīng)驗(yàn)的人對此技術(shù)都是耳熟能詳了吧,當(dāng)前主流開發(fā)語言都支持此技術(shù),如Java和.net,而且具體用法都如出一轍。當(dāng)然對于那些只想使用ORM而不關(guān)心ORM的具體實(shí)現(xiàn)的朋友,這些內(nèi)容不了解也沒有任何影響。這也恰恰是ORM的好處啊。
當(dāng)配置為自動決定何時把對象數(shù)據(jù)寫入DB的模式下,Hibernate采用了一個自動識別對象屬性變化的技術(shù)。即Hibernate知道持久化類哪些屬性發(fā)生了變化,然后據(jù)此來決定后便的操作。關(guān)于此技術(shù)更具體的內(nèi)容,以后再詳述。
從內(nèi)存中獲取數(shù)據(jù)要比從DB中獲取數(shù)據(jù)快得多,所以很多ORM都采用緩存結(jié)束來提高持久化效率,Hibernate也不例外。在Session中保留所有已經(jīng)持久化的對象實(shí)例作為緩存,如果需要獲取的數(shù)據(jù)在緩存中存在,則不去DB中加載。當(dāng)然緩存中數(shù)據(jù)與DB中數(shù)據(jù)的一致性問題,Hibernate就是通過剛剛說過的[識別對象屬性變化]的技術(shù)來實(shí)現(xiàn)的。
Language)是Hibernate自己的查詢語句,它與SQL相似,但是HQL是面向?qū)ο蟮?,它引用類名及類的屬性名,而不是表名及表的字段名?/div>
好了,通過以上這些,基本可以了解Hibernate是什么了,可以開始了解Hibernate的核心接口了,Let's Go...