1. 程式人生 > >hibernate框架ORM的實現原理。

hibernate框架ORM的實現原理。

1.什麼是ORM

ORM的全稱是Object Relational Mapping,即 物件關係對映。它的實現思想就是將關係資料庫中表的資料對映成為物件,以物件的形式展現,這樣開發人員就可以把對資料庫的操作轉化為對這些物件的操作。想來實現因此它的目的是為了方便開發人員以面向物件的思對資料庫的操作。

2.什麼是Hibernate。

  對於Hibernate的稱呼有很多,比如 工具、技術、框架 以及解決方案等,這些都可以,重要的是大家要知道它的作用。在這裡我習慣性稱它為框架它是一種能實現ORM的框架。能實現ORM這個功能的框架有很多,Hibernate可以說是這些框架中最流行、最受開發者關注的,甚至連JBoss公司

也把它吸收進來,利用它在自己的專案中實現ORM功能。

3.ORM的實現原理。

     現在在Java領域大家對Hibernate的討論很多,比如它的優缺點、如何應用、錯誤如何解決以及把它和Struts/Spring等框架相結合作為整個系統的解決方案。在這裡我想和大家探討一些更深層次的話題,那就是Hibernate是如何實現ORM的功能?如果讓我們自己開發一款實現ORM功能的框架需要怎麼做?其實這些問題就是圍繞著一個詞,那就是“對映”,如果我們知道如何實現這種對映那麼我們也能夠開發出自己的一款ORM框架。會使用Hibernate的開發人員都知道,在使用它實現ORM功能的時候,主要的檔案有:對映類(*.java)

、對映檔案(*.hbm.xml)以及資料庫配置檔案(*.properties或*.cfg.xml),以下是各自的作用。

  對映類:它的作用是描述資料庫表的結構,表中的欄位在類中被描述成屬性,將來就可以實現把表中的記錄對映成為該類的物件。

  對映檔案:它的作用是指定資料庫表和對映類之間的關係,包括對映類和資料庫表的對應關係、表字段和類屬性型別的對應關係以及表字段和類屬性名稱的對應關係等。

⑶      資料庫配置檔案:它的作用是指定與資料庫連線時需要的連線資訊,比如連線哪中資料庫、登入使用者名稱、登入密碼以及連線字串等。在這三種主要的檔案中,對映類為普通Java

原始檔對映檔案為XML格式、資料庫配置檔案為Properties格式或者是XML格式。想理解“對映”首先我們需要知道如何解析這三種檔案,即解析XML格式檔案、解析Properties格式檔案和解析Java類檔案。下面我們來分別探討一下如何實現這些檔案的解析。

 

⑴  如何解析XML檔案

 

   前面我們說過對映檔案是XML格式,資料庫配置檔案也可以是XML格式,因此如果能解析XML檔案我們就可以獲取這兩個檔案的資訊。XML檔案格式我簡單做下介紹,比如tom這句就是一個XML格式的描述,name代表節點,節點必須有開始標記和結束標記,在開始標記中我們可以新增一些屬性的宣告比如sex。解析XML的技術可以分為兩類那就是SAX和DOM,這兩種方式的差別和優缺點大家可以上網查閱或者我們會在以後的文章中提出,請大家關注。實現解析XML檔案的功能很方便,我們可以通過下載第三方的一些工具包如xml-apis.jar和xercesImpl.jar等,也可以使用JDK自帶的工具類DocumentBuilderFactory、DocumentBuilder、Document、Element等等,大家可以通過API文擋查閱這些類的說明。通過這些類我們可以把XML檔案的資訊讀入記憶體並通過類中的某些方法獲取指定節點的名字、值、屬性名、屬性值這些資訊。

 

⑵  解析Properties檔案

 

   資料庫配置檔案可以是XML格式也可以是Properties格式,Properties檔案一般採用“屬性名=屬性值”的形式描述資訊。如果配置檔案採用Properties檔案描述,我們就需要想辦法解析這種型別的檔案了。想解析Properties檔案大家就需要熟悉Properties這個類了,這個類有一些常用方法比如,load()載入指定檔案並讀取檔案中的屬性資訊,PropertyNames()返回所有屬性名,getProperty()返回指定屬性名的屬性值。通過解析Properties檔案我們可以得到連線資料庫必要的資訊,然後通過底層JDBC技術與資料庫建立連線。

 

⑶  解析Java類檔案

 

   通過解析對映檔案和資料庫配置檔案我們可以建立資料庫的連線,可以得到對映類的名字、屬性名、資料庫表名、欄位名以及型別等資訊。要把資料庫中表的資料對映成為物件,首先需要把表中的記錄取出,然後將每個欄位值給對映類物件的每個屬性,這個賦值過程要呼叫物件中的set方法。我們現在通過對映檔案只知道類名和屬性名,如何根據類名和屬性名呼叫相應的set和get方法,是一個關鍵問題。在Java中有一種機制叫反射機制,使用這種機制我們可以得到類的資訊,包括類只用的修飾符、方法、屬性、繼承的父類以及實現介面等資訊。反射機制相關的類有Class、Field、Method以及Constructor等。通過Class的getFields()、getMethods()和getConstructors()方法得到相應的屬性、方法和構造方法。通過Field類的getName()、getType()和getModifiers()方法得到相應的屬性名、屬性型別、屬性修飾符資訊。通過Method類getReturnType()可以獲取方法的返回型別,invoke()方法可以根據給定的方法名和引數值執行物件中對應的方法。我們可以首先通過以上方法獲取類中的屬性名,然後拼寫成setXXX和getXXX方法名,最後根據方法名執行對應的方法,將資料庫資料載入到物件中。此外要實現Hibernate機制還會涉及到一個技術點,那就是如何獲取資料庫的相關資訊。要實現這個功能,就需要大家瞭解JDBC的DataBaseMetaData類和ResultSetMetaData類,通過這兩個類的方法我們就可以獲取資料庫表的欄位名、型別、大小等相關資訊。

4、Hibernate實現原理中使用的技術有什麼?

   針對主流的XML檔案配置方式,Hibernate實現原理中使用 的關鍵技術主要有兩個。一是對XML文件的解析——使用DOM(文件物件模型)/SAX解析,Hibernate使用了常見的開源解析工具—— dom4j(使用Java編寫,很流行),二是Java的反射技術,比如我可以通過一個Java類的物件,通過反射機制來獲取這個物件的類的屬性,方 法……簡單說,就類似我自己照鏡子,通過鏡子,我可以看清楚我自己身體的各個部位。

   當然了,還有基於註解的方式,那麼就還要使用Java的註解技術,本質上大同小異,熟能生巧。

5、反射的應用

· 操作資料庫,動態建立SQL語句

· 解析XML,properties配置檔案,動態生成物件

· Java的動態代理

· 框架中使用的最多:Struts框架、Spring框架、Hibernate框架、MyBatis框架……

6、持久化的物件的狀態

       何謂“持久化”持久(Persistence),即把資料(如記憶體中的物件)儲存到可永久儲存的儲存裝置中(如磁碟)。持久化的主要應用是將記憶體中的資料儲存在關係型的資料庫中,當然也可以儲存在磁碟檔案中、XML資料檔案中等等。持久化顧名思義就是把快取中的東西放到資料庫中使之持久

對於需要持久化的物件,它的生命週期分為三個狀態:臨時狀態,持久化狀態,遊離狀態.

臨時狀態(Transient):剛剛用new語句建立,沒有被持久化,不處於session的快取中.處於臨時狀態的java物件被稱為臨時物件.

持久化狀態(Persistent):已經被持久化,加入到session的快取中.處於持久化的java物件被稱為持久化物件.

遊離狀態(Detached):已經被持久化,但不處於session的快取中,處於遊離狀態的java物件被成為遊離物件.

7、ORM模式

       ORM是實現持久化的技術之一,ORM—Object-Relational Mapping物件到關係的對映,通過使用描述物件和資料庫之間的元資料,將Java程式中的物件自動持久化到關係資料庫中。

物件和關係資料是業務實體的兩種表現形式,業務實體在記憶體中表現為物件,在資料庫中表現為關係資料。記憶體中的物件之間存在關聯和繼承關係,而在資料庫中,關係資料庫無法直接表達多對多關聯和繼承關係。因此,ORM一般以中介軟體的形式存在,主要實現程式物件到關係資料庫的對映,ORM中介軟體能在任何一個Java程式的業務邏輯層和資料庫層之間充當橋樑。

8、ORM的優點

1.提高了開發效率。由於ORM可以自動對實體物件與資料庫中的表進行欄位與屬性的對映,所以實際操作中已經不再需要一個專用的、龐大的資料訪問層。

2.ORM提供了對資料庫的對映能夠像操作物件一樣從資料庫中獲取資料,而不用直接進行SQL編碼。

9、ORM的缺點

1、系統結構方面,採用ORM的系統一般都是多層系統,層次多了效率就會降低。

2.效能方面,主要體現在對持久化物件的提取和對資料的加工處理上,採用ORM時,系統可能將全部資料提取到記憶體物件中,然後進行過濾和加工處理,這樣會產生效能的問題。

3.物件持久化方面,ORM一般會持久化所有的屬性,這對有些應用是不希望發生的。

常用的ORM中介軟體有Hibernate、IBatis、Apache OJB等等

以上的持久化技術是Hibernate實現ORM模式,還有其他的實現持久化模式