標籤:
原文連結:http://blog.163.com/hzd_love/blog/static/13199988120107891854473/
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檔案格式我簡單做下介紹,比如<name sex=”male”>tom</name>這句就是一個XML格式的描述,name代表節點,節點必須有開始標記<name>和結束標記</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還使用了事務控制、緩衝控制等很多技術
ORM(Object-Relational Mapping 對象關係映射)如何?(轉)