hibernate原理(資料)

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 類,通過這兩個類的方法我們就可以獲取數據庫表的字段名、類型、大小等相關信息。在這裏我只是給大家把實現 ORM 功能的一些關鍵技術提了出來,通過上面介紹大家對 ORM 機制應該有個大概瞭解,比如通過解析數據庫配置文件獲取數據庫連接信息並建立連接,通過解析映射文件可以獲取映射類名、屬性名、表名以及字段名等信息,得到名字後通過反射機制可以得到映射類信息,調用構造方法創建對象,調用每個屬性的 set 方法給對象設值完成數據的裝載。 Hibernate 就是採用這個過程來實現 ORM 的,當然 Hibernate 還使用了事務控制 、緩存控制 等很多技術,大家有興趣的話我們可以以後探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章