1. 什麼是ORMjava
ORM的全稱是Object Relational Mapping,即對象關係映射。它的實現思想就是將關係數據庫中表的數據映射成爲對象,以對象的形式展示,這樣開發人員就能夠把對數據庫的操做轉化爲對這些對象的操做。所以它的目的是爲了方便開發人員以面向對象的思想來實現對數據庫的操做。數據庫
2.什麼是Hibernateapi
對於Hibernate的稱呼有不少,好比工具、技術、框架以及解決方案等,這些均可以,重要的是你們要知道它的做用。在這裏我習慣性稱它爲框架,它是一種能實現ORM的框架。能實現ORM這個功能的框架有不少,Hibernate能夠說是這些框架中最流行、最受開發者關注的,甚至連JBoss公司也把它吸取進來,利用它在本身的項目中實現ORM功能。緩存
3.ORM的實現原理app
如今在Java領域你們對Hibernate的討論不少,好比它的優缺點、如何應用、錯誤如何解決以及把它和Struts/Spring等框架相結合做爲整個系統的解決方案。在這裏我想和你們探討一些更深層次的話題,那就是Hibernate是如何實現ORM的功能?若是讓咱們本身開發一款實現ORM功能的框架須要怎麼作?其實這些問題就是圍繞着一個詞,那就是「映射」,若是咱們知道如何實現這種映射那麼咱們也可以開發出本身的一款ORM框架。會使用Hibernate的開發人員都知道,在使用它實現ORM功能的時候,主要的文件有:映射類(*.java)、映射文件(*.hbm.xml)以及數據庫配置文件(*.properties或*.cfg.xml),它們各自的做用以下。框架
⑴映射類:它的做用是描述數據庫表的結構,表中的字段在類中被描述成屬性,未來就能夠實現把表中的記錄映射成爲該類的對象。工具
⑵映射文件:它的做用是指定數據庫表和映射類之間的關係,包括映射類和數據庫表的對應關係、表字段和類屬性類型的對應關係以及表字段和類屬性名稱的對應關係等。ui
⑶數據庫配置文件:它的做用是指定與數據庫鏈接時須要的鏈接信息,好比鏈接哪中數據庫、登陸用戶名、登陸密碼以及鏈接字符串等。.net
在這三種主要的文件中,映射類爲普通Java源文件、映射文件爲XML格式、數據庫配置文件爲Properties格式或者是XML格式。想理解「映射」首先咱們須要知道如何解析這三種文件,即解析XML格式文件、解析Properties格式文件和解析Java類文件。下面咱們來分別探討一下如何實現這些文件的解析。xml
⑴如何解析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還使用了事務控制、緩存控制等不少技術,你們有興趣的話咱們能夠之後探討。
限於時間的緣由前面提到的一些技術介紹的比較簡單,對於有些人可能理解有困難,不要緊我會在之後的時間把各個技術分別進行詳細的介紹,請你們關注,同時熱情邀請你們一塊兒討論,經過逐步剖析Hibernate,使咱們對Hibernate的理解和駕御能力更近一步。謝謝你們。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fenglibing/archive/2007/08/31/1767339.aspx