隨筆 - 0, 文章 - 75, 評(píng)論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          Hibernate框架ORM的實(shí)現(xiàn)原理-不是技術(shù)的技術(shù)


          Hibernate 框架 ORM
          的實(shí)現(xiàn)原理


          2007-08-24 來自:梁建全


          梁建全 :


          東方標(biāo)準(zhǔn)國(guó)際軟件專業(yè)講師,曾經(jīng)負(fù)責(zé)過的重大的大型項(xiàng)目包括:全軍武器裝備質(zhì)量管理系統(tǒng)、全軍辦公自動(dòng)化系統(tǒng)、日本
          NTT 電信管理系統(tǒng)等。主要著作包括《 ASP.NET 開發(fā)答疑 200 問》《 ASP.NET 開發(fā)實(shí)例導(dǎo)航》等。畢業(yè)于北京大學(xué)計(jì)算機(jī)專業(yè)。



          1.
          什么是 ORM



          ORM 的全稱是 Object Relational Mapping
          ,即對(duì)象關(guān)系映射。它的實(shí)現(xiàn)思想就是將關(guān)系數(shù)據(jù)庫(kù)中表的數(shù)據(jù)映射成為對(duì)象,以對(duì)象的形式展現(xiàn),這樣開發(fā)人員就可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)這些對(duì)象的操作。因此它的目的是為了方便開發(fā)人員以面向?qū)ο蟮乃枷雭韺?shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。



          2
          什么是 Hibernate



          對(duì)于 Hibernate
          的稱呼有很多,比如工具、技術(shù)、框架以及解決方案等,這些都可以,重要的是大家要知道它的作用。在這里我習(xí)慣性稱它為框架,它是一種能實(shí)現(xiàn)
          ORM
          的框架 。能實(shí)現(xiàn) ORM 這個(gè)功能的框架有很多, Hibernate 可以說是這些框架中最流行、最受開發(fā)者關(guān)注的,甚至連 JBoss 公司也把它吸收進(jìn)來,利用它在自己的項(xiàng)目中實(shí)現(xiàn)
          ORM 功能。



          3
          ORM
          的實(shí)現(xiàn)原理



          現(xiàn)在在 Java 領(lǐng)域大家對(duì) Hibernate 的討論很多,比如它的優(yōu)缺點(diǎn)、如何應(yīng)用、錯(cuò)誤如何解決以及把它和
          Struts/Spring
          等框架相結(jié)合作為整個(gè)系統(tǒng)的解決方案。在這里我想和大家探討一些更深層次的話題,那就是 Hibernate 是如何實(shí)現(xiàn) ORM 的功能?如果讓我們自己開發(fā)一款實(shí)現(xiàn) ORM
          功能的框架需要怎么做?其實(shí)這些問題就是圍繞著一個(gè)詞,那就是“映射”,如果我們知道如何實(shí)現(xiàn)這種映射那么我們也能夠開發(fā)出自己的一款
          ORM 框架。會(huì)使用 Hibernate 的開發(fā)人員都知道,在使用它實(shí)現(xiàn) ORM
          功能的時(shí)候,主要的文件有:映射類( *.java )、映射文件( *.hbm.xml
          )以及數(shù)據(jù)庫(kù)配置文件( *.properties *.cfg.xml
          ,它們各自的作用如下。



          映射類
          :它的作用是描述數(shù)據(jù)庫(kù)表的結(jié)構(gòu),表中的字段在類中被描述成屬性,將來就可以實(shí)現(xiàn)把表中的記錄映射成為該類的對(duì)象。



          映射文件
          :它的作用是指定數(shù)據(jù)庫(kù)表和映射類之間的關(guān)系,包括映射類和數(shù)據(jù)庫(kù)表的對(duì)應(yīng)關(guān)系、表字段和類屬性類型的對(duì)應(yīng)關(guān)系以及表字段和類屬性名稱的對(duì)應(yīng)關(guān)系等。



          數(shù)據(jù)庫(kù)配置文件
          :它的作用是指定與數(shù)據(jù)庫(kù)連接時(shí)需要的連接信息,比如連接哪中數(shù)據(jù)庫(kù)、登錄用戶名、登錄密碼以及連接字符串等。



          在這三種主要的文件中,映射類為普通 Java 源文件、映射文件為 XML 格式、數(shù)據(jù)庫(kù)配置文件為 Properties 格式或者是 XML 格式。想理解“映射”首先我們需要知道如何解析這三種文件,即解析 XML 格式文件、解析 Properties 格式文件和解析 Java 類文件。下面我們來分別探討一下如何實(shí)現(xiàn)這些文件的解析。



          ⑴如何解析
          XML
          文件



          前面我們說過映射文件是 XML 格式,數(shù)據(jù)庫(kù)配置文件也可以是 XML 格式,因此如果能解析 XML 文件我們就可以獲取這兩個(gè)文件的信息。 XML 文件格式我簡(jiǎn)單做下介紹,比如 tom 這句就是一個(gè) XML 格式的描述, name
          代表節(jié)點(diǎn),節(jié)點(diǎn)必須有開始標(biāo)記和結(jié)束標(biāo)記,在開始標(biāo)記中我們可以添加一些屬性的聲明比如 sex 。解析 XML 的技術(shù)可以分為兩類那就是 SAX DOM
          ,這兩種方式的差別和優(yōu)缺點(diǎn)大家可以上網(wǎng)查閱或者我們會(huì)在以后的文章中提出,請(qǐng)大家關(guān)注。實(shí)現(xiàn)解析 XML 文件的功能很方便,我們可以通過下載第三方的一些工具包如 xml-apis.jar xercesImpl.jar 等,也可以使用 JDK 自帶的工具類 DocumentBuilderFactory


          DocumentBuilder Document Element 等等,大家可以通過 API 文擋查閱這些類的說明。通過這些類我們可以把 XML
          文件的信息讀入內(nèi)存并通過類中的某些方法獲取指定節(jié)點(diǎn)的名字、值、屬性名、屬性值這些信息。



          解析
          Properties
          文件



          數(shù)據(jù)庫(kù)配置文件可以是 XML 格式也可以是 Properties 格式, Properties 文件一般采用“屬性名 = 屬性值”的形式描述信息。如果配置文件采用 Properties 文件描述,我們就需要想辦法解析這種類型的文件了。想解析
          Properties 文件大家就需要熟悉 Properties 這個(gè)類了,這個(gè)類有一些常用方法比如,
          load() 加載指定文件并讀取文件中的屬性信息,
          PropertyNames() 返回所有屬性名,
          getProperty()
          返回指定屬性名的屬性值。通過解析 Properties 文件我們可以得到連接數(shù)據(jù)庫(kù)必要的信息,然后通過底層 JDBC 技術(shù)與數(shù)據(jù)庫(kù)建立連接。



          解析
          Java
          類文件



          通過解析映射文件和數(shù)據(jù)庫(kù)配置文件我們可以建立數(shù)據(jù)庫(kù)的連接,可以得到映射類的名字、屬性名、數(shù)據(jù)庫(kù)表名、字段名以及類型等信息。要把數(shù)據(jù)庫(kù)中表的數(shù)據(jù)映射成為對(duì)象,首先需要把表中的記錄取出,然后將每個(gè)字段值給映射類對(duì)象的每個(gè)屬性,這個(gè)賦值過程要調(diào)用對(duì)象中的
          set
          方法。我們現(xiàn)在通過映射文件只知道類名和屬性名,如何根據(jù)類名和屬性名調(diào)用相應(yīng)的 set get 方法,是一個(gè)關(guān)鍵問題。在 Java
          中有一種機(jī)制叫反射機(jī)制,使用這種機(jī)制我們可以得到類的信息,包括類只用的修飾符、方法、屬性、繼承的父類以及實(shí)現(xiàn)接口等信息。反射機(jī)制相關(guān)的類有
          Class Field Method 以及 Constructor 等。通過 Class getFields() getMethods() getConstructors() 方法得到相應(yīng)的屬性、方法和構(gòu)造方法。通過
          Field 類的 getName() getType() getModifiers() 方法得到相應(yīng)的屬性名、屬性類型、屬性修飾符信息。通過
          Method getReturnType() 可以獲取方法的返回類型, invoke()
          方法可以根據(jù)給定的方法名和參數(shù)值執(zhí)行對(duì)象中對(duì)應(yīng)的方法。我們可以首先通過以上方法獲取類中的屬性名,然后拼寫成 setXXX getXXX
          方法名,最后根據(jù)方法名執(zhí)行對(duì)應(yīng)的方法,將數(shù)據(jù)庫(kù)數(shù)據(jù)加載到對(duì)象中。



          此外要實(shí)現(xiàn) Hibernate
          機(jī)制還會(huì)涉及到一個(gè)技術(shù)點(diǎn),那就是如何獲取數(shù)據(jù)庫(kù)的相關(guān)信息。要實(shí)現(xiàn)這個(gè)功能,就需要大家了解 JDBC DataBaseMetaData 類和 ResultSetMetaData
          類,通過這兩個(gè)類的方法我們就可以獲取數(shù)據(jù)庫(kù)表的字段名、類型、大小等相關(guān)信息。在這里我只是給大家把實(shí)現(xiàn) ORM 功能的一些關(guān)鍵技術(shù)提了出來,通過上面介紹大家對(duì) ORM
          機(jī)制應(yīng)該有個(gè)大概了解,比如通過解析數(shù)據(jù)庫(kù)配置文件獲取數(shù)據(jù)庫(kù)連接信息并建立連接,通過解析映射文件可以獲取映射類名、屬性名、表名以及字段名等信息,得到名字后通過反射機(jī)制可以得到映射類信息,調(diào)用構(gòu)造方法創(chuàng)建對(duì)象,調(diào)用每個(gè)屬性的
          set 方法給對(duì)象設(shè)值完成數(shù)據(jù)的裝載。 Hibernate 就是采用這個(gè)過程來實(shí)現(xiàn) ORM 的,當(dāng)然 Hibernate 還使用了事務(wù)控制
          緩存控制 等很多技術(shù),大家有興趣的話我們可以以后探討。



          限于時(shí)間的原因前面提到的一些技術(shù)介紹的比較簡(jiǎn)單,對(duì)于有些人可能理解有困難,沒關(guān)系我會(huì)在以后的時(shí)間把各個(gè)技術(shù)分別進(jìn)行詳細(xì)的介紹,請(qǐng)大家關(guān)注,同時(shí)熱情邀請(qǐng)大家一起討論,通過逐步剖析
          Hibernate ,使我們對(duì) Hibernate
          的理解和駕御能力更近一步。謝謝大家。



          讀后感:



          這篇文章,如果從操作技術(shù)層面上來講,確實(shí)沒有說什么,因?yàn)樵谖铱戳诉@篇文章之后,并不能夠讓我現(xiàn)在就可以使用 Hibernate
          。但是,我至少對(duì)這個(gè)輪廓有了一個(gè)初步的了解了,假如說我們現(xiàn)在身處大山里面,要想從大山里面出去,一看,那里都是高山,就不知道如何走、走那個(gè)方向;而如果說我們是站在一座高山上,要去山外還是有那么遠(yuǎn),所有的路程還是得自己走,但是我看到了方向,知道自己朝著這個(gè)方向走肯定能夠走出去。我看了這篇文章就是這個(gè)感覺,真希望以后能夠多看到這樣的文章,而不是一來就是這里要配置什么,那里需要怎么做,還沒有開始,就昏了。



          posted on 2012-04-22 15:53 hantai 閱讀(270) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大新县| 门源| 台东市| 井陉县| 长顺县| 北安市| 正安县| 体育| 金山区| 上蔡县| 康乐县| 无极县| 秀山| 南汇区| 交口县| 邯郸县| 平山县| 抚顺县| 澎湖县| 崇左市| 徐汇区| 肃宁县| 巩留县| 丹巴县| 浦东新区| 东乌珠穆沁旗| 昆山市| 和田市| 德清县| 石屏县| 顺平县| 剑河县| 榆社县| 蕲春县| 神木县| 长武县| 镇沅| 策勒县| 桃园县| 卓资县| 镇赉县|