《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于DAO模式的Hibernate框架 在Java Web開(kāi)發(fā)中的應(yīng)用
基于DAO模式的Hibernate框架 在Java Web開(kāi)發(fā)中的應(yīng)用
2015年微型機(jī)與應(yīng)用第11期
王正玉,李 斌
(安徽廣播電視大學(xué) 遠(yuǎn)程教育技術(shù)與圖文信息中心 圖書(shū)館,安徽 合肥 230022)
摘要: Hibernate是目前Java領(lǐng)域中最受歡迎的OR映射開(kāi)源框架,它的出現(xiàn)使程序員得以擺脫編寫(xiě)繁瑣SQL語(yǔ)句的麻煩,將更多的精力用于業(yè)務(wù)邏輯的設(shè)計(jì)。DAO即數(shù)據(jù)訪問(wèn)對(duì)象,其目的是實(shí)現(xiàn)一種用來(lái)操作數(shù)據(jù)源的訪問(wèn)機(jī)制。通過(guò)DAO層的抽象,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開(kāi)來(lái),實(shí)現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合,即使改變DAO實(shí)現(xiàn)代碼也不會(huì)影響業(yè)務(wù)層的調(diào)用。通過(guò)案例,對(duì)基于DAO模式的Hibernate框架技術(shù)進(jìn)行了介紹。
Abstract:
Key words :

王正玉,李 斌

(安徽廣播電視大學(xué) 遠(yuǎn)程教育技術(shù)與圖文信息中心 圖書(shū)館,安徽 合肥 230022)

  摘  要Hibernate是目前Java領(lǐng)域中最受歡迎的OR映射開(kāi)源框架,它的出現(xiàn)使程序員得以擺脫編寫(xiě)繁瑣SQL語(yǔ)句的麻煩,將更多的精力用于業(yè)務(wù)邏輯的設(shè)計(jì)。DAO即數(shù)據(jù)訪問(wèn)對(duì)象,其目的是實(shí)現(xiàn)一種用來(lái)操作數(shù)據(jù)源的訪問(wèn)機(jī)制。通過(guò)DAO層的抽象,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開(kāi)來(lái),實(shí)現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合,即使改變DAO實(shí)現(xiàn)代碼也不會(huì)影響業(yè)務(wù)層的調(diào)用。通過(guò)案例,對(duì)基于DAO模式的Hibernate框架技術(shù)進(jìn)行了介紹。

  關(guān)鍵詞: Hibernate;DAO模式;數(shù)據(jù)持久;框架

0 引言

  OR Mapping對(duì)象關(guān)系映射技術(shù)在Java領(lǐng)域中已經(jīng)取得廣泛的應(yīng)用。Hibernate則是該領(lǐng)域中最受歡迎的OR映射開(kāi)源框架,Hibernate技術(shù)使程序員得以擺脫編寫(xiě)繁瑣SQL語(yǔ)句的麻煩,使其將更多精力應(yīng)用于業(yè)務(wù)邏輯的設(shè)計(jì)。

  DAO(Data Access Object)即數(shù)據(jù)訪問(wèn)對(duì)象,主要為了實(shí)現(xiàn)一種用來(lái)操作數(shù)據(jù)源的訪問(wèn)機(jī)制。數(shù)據(jù)源可以是RDBMS關(guān)系數(shù)據(jù)庫(kù)、LDAP目錄服務(wù)器、XML文件等。依賴(lài)于DAO的業(yè)務(wù)組件為其客戶端使用DAO提供更簡(jiǎn)單的接口[1]。

  本文采用一種基于DAO的Hibernate的設(shè)計(jì)模式來(lái)實(shí)現(xiàn)在J2EE開(kāi)發(fā)[2]的數(shù)據(jù)層表示,數(shù)據(jù)庫(kù)為Oracle 10g數(shù)據(jù)庫(kù)。并通過(guò)編寫(xiě)例程的方式詳細(xì)介紹Hibernate和DAO的原理、技術(shù)及開(kāi)發(fā)步驟等。

1 Hibernate原理及應(yīng)用

  1.1 Hibernate技術(shù)的原理

  Hibernate是個(gè)獨(dú)立的對(duì)象關(guān)系映射系統(tǒng)(ORM)的持久化框架,它本身不依賴(lài)于Web服務(wù)器(如Tomcat)或應(yīng)用服務(wù)器(如JBoss)的支持。Hibernate實(shí)質(zhì)上是一種對(duì)象關(guān)系映射工具,即它的原理就是ORM[3]。

  ORM是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配問(wèn)題而出現(xiàn)的一種技術(shù)。簡(jiǎn)單地說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將Java程序中的對(duì)象自動(dòng)持久到關(guān)系數(shù)據(jù)庫(kù)中。ORM是隨著面向?qū)ο蟮能浖_(kāi)發(fā)方法的發(fā)展而產(chǎn)生的。ORM系統(tǒng)通常以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射。ORM具有實(shí)體映射、關(guān)系映射、高級(jí)查詢、事物處理、實(shí)體類(lèi)和操作類(lèi)的生成等五大特征。

  1.2 Hibernate的體系結(jié)構(gòu)

  Hibernate主要由持久化對(duì)象、配置文件和對(duì)象關(guān)系映射文件構(gòu)成。如下圖1所示。

001.jpg

  從圖1中可以看出,應(yīng)用層抽象出業(yè)務(wù)的POJO(Plain Ordinary Java Objects)對(duì)象并通過(guò)Hibernate及映射文件的定義來(lái)實(shí)現(xiàn)其業(yè)務(wù)對(duì)象的持久化管理。

  Hibernate有兩類(lèi)[4]重要文件,一類(lèi)是配置文件(擴(kuò)展名為.cfg.xml),另一類(lèi)是映射文件(擴(kuò)展名為.hbm.xml)。映射文件的主要作用是告訴Hibernate如何把POJO對(duì)象持久到數(shù)據(jù)庫(kù)中。配置文件的作用是對(duì)Hibernate環(huán)境進(jìn)行配置,這里包括使用的數(shù)據(jù)庫(kù)或數(shù)據(jù)源等信息。

  1.3 Hibernate的核心接口

  在Hibernate中,其核心接口主要有以下五個(gè):

 ?。?)Configuration接口。該類(lèi)抽象了負(fù)責(zé)加載Hibernate的配置及映射信息,一個(gè)Configuration對(duì)象實(shí)例代表一個(gè)應(yīng)用程序中Java類(lèi)型到SQL數(shù)據(jù)庫(kù)映射的完整集合,Configuration被用來(lái)構(gòu)建一個(gè)SessionFactory,映射定義則由不同的XML映射定義文件編譯而來(lái)。

 ?。?)SessionFactory接口。其為一個(gè)Java接口,它是針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯得到的內(nèi)存鏡像。單個(gè)項(xiàng)目通常只需一個(gè)SessionFactory,當(dāng)該項(xiàng)目需操作多個(gè)數(shù)據(jù)庫(kù)時(shí),必須為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。

 ?。?)Session接口。該接口對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)很重要,表示應(yīng)用程序與數(shù)據(jù)持久層之間交互操作的一個(gè)單線程對(duì)象,此對(duì)象生存期很短。其隱藏了JDBC連接,同時(shí)也是Hibernate事務(wù)(Transcation)的工廠。

  (4)Transaction接口。Hibernate通過(guò)Transaction來(lái)聲明事務(wù)邊界。Hibernate可以配置為JDBC、JTA或CMT三種事務(wù)之一。

 ?。?)Query。在Hibernate中,HQL語(yǔ)言是Hibernate提供的一個(gè)非常強(qiáng)大的面向?qū)ο蟮牟樵冋Z(yǔ)言,其語(yǔ)言特性與SQL語(yǔ)言非常類(lèi)似。

  1.4 例程數(shù)據(jù)庫(kù)設(shè)計(jì)

  在本文設(shè)計(jì)的網(wǎng)上書(shū)店系統(tǒng)中,其數(shù)據(jù)庫(kù)中共有五張表:

 ?。?)bookinfo表,存儲(chǔ)書(shū)籍相關(guān)信息。創(chuàng)建該表的Oracle語(yǔ)句如下:

  CREATE TABLE bookinfo(

  id number(10) NOT NULL,//書(shū)籍ID

  bookName varchar(128)default′′,//書(shū)名

  isbn varchar(64)default ′′,//序列號(hào)

  writer varchar(45)NOT NULL,//作者

  publisher varchar(64)default′′,//出版社

  intro varchar2(150),//簡(jiǎn)介

  price decimal(5,2)default 0.00,//價(jià)格

  remaining number(5)default 0,//庫(kù)存量

  picture varchar(32),//書(shū)籍封面

  date1 date NOT NULL,//日期

  PRIMARY KEY(id)

  );

 ?。?)rebate表,存放書(shū)籍相關(guān)折扣信息。創(chuàng)建該表的Oracle語(yǔ)句如下:

  CREATE TABLE remark(

  id number(10)NOT NULL,//序列號(hào)

  bookid number(10)NOT NULL,//客戶等級(jí)

  userid number(10)NOT NULL,//折扣率

  grade number(3)NOT NULL,

  remark varchar2(50)NOT NULL,

  date1 date NOT NULL,

  PRIMARY KEY(id)

 ?。?;

 ?。?)用戶表userinfo,存放用戶相關(guān)信息。創(chuàng)建該表的Oracle語(yǔ)句如下:

  CREATE TABLE userinfo(

  id number(10),//用戶ID

  username varchar(15)NOT NULL,//用戶名

  pwd varchar(32)NOT NULL,//用戶密碼

  email varchar(32)NOT NULL,//用戶郵箱

  address varchar(100)default NULL,//通訊地址

  postcode varchar(6)default NULL,//郵編

  level1 decimal(10,2),//用戶等級(jí)

  power number(3)NOT NULL,//充值信息

  PRIMARY KEY(id)

  );

 ?。?)訂購(gòu)表order1,存放當(dāng)前已交易的訂單信息。創(chuàng)建該表的Oracle語(yǔ)句如下:

  CREATE TABLE order1(

  id number(10) NOT NULL,//訂單ID

  bookid number(10)NOT NULL,//書(shū)籍ID

  userid number(10)NOT NULL,//用戶ID

  number1 number(3)NOT NULL,//銷(xiāo)量

  address varchar2(128)NOT NULL,//通訊地址

  postcode varchar2(6)NOT NULL,//郵編

  orderdate date NOT NULL,//訂購(gòu)日期

  status number(3)NOT NULL,//當(dāng)前發(fā)貨狀態(tài)

  PRIMARY KEY(id)

 ?。?;

 ?。?)評(píng)價(jià)表remark存放書(shū)籍的相關(guān)評(píng)價(jià)信息。創(chuàng)建該表的Oracle語(yǔ)句如下:

  CREATE TABLE remark(

  id number(10)NOT NULL,//評(píng)價(jià)信息ID

  bookid number(10)NOT NULL,//書(shū)籍ID

  userid number(10)NOT NULL,//用戶ID

  grade number(3)NOT NULL,//評(píng)價(jià)等級(jí)

  remark varchar2(50)NOT NULL,//評(píng)價(jià)內(nèi)容

  date1 date NOT NULL,//評(píng)價(jià)日期

  PRIMARY KEY(id)

 ?。?;

  1.5 Hibernate技術(shù)的開(kāi)發(fā)步驟及應(yīng)用

  Hibernate的開(kāi)發(fā)步驟大體分為三步:(1)持久化類(lèi)的設(shè)計(jì)。所謂的持久化類(lèi)是指POJO類(lèi)。(2)持久化類(lèi)和關(guān)系數(shù)據(jù)庫(kù)的映射。(3)應(yīng)用的開(kāi)發(fā)。

006.jpg

  本文按照Hibernate的開(kāi)發(fā)步驟設(shè)計(jì)了網(wǎng)上書(shū)店系統(tǒng)的數(shù)據(jù)層。將數(shù)據(jù)庫(kù)中表與持久化類(lèi)一一對(duì)應(yīng),對(duì)應(yīng)關(guān)系如表1所示。在對(duì)應(yīng)類(lèi)中,設(shè)置對(duì)應(yīng)表的相應(yīng)字段的變量及獲取,設(shè)置該字段值的方法。接著在各自持久化類(lèi)對(duì)應(yīng)的.hbm.xml映射文件中,設(shè)置了各自類(lèi)與其對(duì)應(yīng)的表的映射環(huán)境參數(shù)。最后再在基于DAO模式的技術(shù)中進(jìn)行相關(guān)應(yīng)用開(kāi)發(fā)。

2 DAO模式的介紹

  數(shù)據(jù)訪問(wèn)對(duì)象模型(Data Access Object)負(fù)責(zé)溝通數(shù)據(jù)庫(kù),處于業(yè)務(wù)邏輯層與數(shù)據(jù)源之間,是一種抽象數(shù)據(jù)源,其目的是為了提供業(yè)務(wù)邏輯對(duì)數(shù)據(jù)的透明訪問(wèn)。具體模式結(jié)構(gòu)如圖2所示。

002.jpg

  DAO模式揭示了應(yīng)用系統(tǒng)與數(shù)據(jù)源之間的關(guān)系??梢钥吹?,應(yīng)用系統(tǒng)可以包含一個(gè)或多個(gè)數(shù)據(jù)訪問(wèn)對(duì)象,并且數(shù)據(jù)訪問(wèn)對(duì)象可以訪問(wèn)不同的數(shù)據(jù)源。對(duì)于Web應(yīng)用而言,數(shù)據(jù)訪問(wèn)對(duì)象隔離了不同數(shù)據(jù)源之間的差異,從而實(shí)現(xiàn)了業(yè)務(wù)邏輯層與數(shù)據(jù)源之間的解耦。

  DAO模式是標(biāo)準(zhǔn)的J2EE設(shè)計(jì)模式[5]之一。典型的DAO由以下幾個(gè)組件構(gòu)成:(1)DAO數(shù)據(jù)訪問(wèn)接口,作為外界訪問(wèn)數(shù)據(jù)對(duì)象的統(tǒng)一接口;(2)DAO接口的實(shí)現(xiàn)類(lèi),負(fù)責(zé)DAO接口對(duì)不同數(shù)據(jù)源的實(shí)現(xiàn);(3)傳遞與DAO層的數(shù)據(jù)訪問(wèn)對(duì)象(域?qū)ο蠡蛑祵?duì)象),保存的是業(yè)務(wù)狀態(tài)數(shù)據(jù);(4)DAO工廠類(lèi),負(fù)責(zé)創(chuàng)建不同業(yè)務(wù)領(lǐng)域的DAO對(duì)象。

3 基于DAO模式的Hibernate設(shè)計(jì)及應(yīng)用

  在基于DAO模式的Hibernate設(shè)計(jì)中,數(shù)據(jù)訪問(wèn)都是通過(guò)DAO層封裝實(shí)現(xiàn)的。每個(gè)DAO實(shí)例都是為一個(gè)域?qū)ο蠓?wù);每一個(gè)獨(dú)立的域?qū)ο蠖加邢鄳?yīng)的DAO實(shí)現(xiàn);DAO的職責(zé)是對(duì)域?qū)ο筮M(jìn)行CRUD(即Create、Read、Update、Delete)操作;DAO允許通過(guò)簡(jiǎn)單的查找方法來(lái)返回一組域?qū)ο?。在DAO對(duì)象中,包含了對(duì)POJO類(lèi)進(jìn)行的操作。在DAO對(duì)象中調(diào)用了Hibernate的Configuraton、Session、Transaction、SessionFactory、Query等核心接口。本文例程中,DAO接口有四類(lèi),分別為UserDao類(lèi)、IorderDao類(lèi)、IBookDao類(lèi)和IBaseDao類(lèi)。上述接口類(lèi)分別對(duì)應(yīng)著各自的接口實(shí)現(xiàn)類(lèi),分別為UserDaoImpl子類(lèi)、IorderDaoImpl子類(lèi)、IBookDaoImpl子類(lèi)、IBaseDaoImpl子類(lèi)。

4 網(wǎng)上書(shū)店數(shù)據(jù)層結(jié)果展示

  通過(guò)這種基于DAO模式的Hibernate設(shè)計(jì)方法,完成了網(wǎng)上書(shū)店系統(tǒng)的數(shù)據(jù)層設(shè)計(jì)工作。系統(tǒng)運(yùn)行的主界面如圖3所示。

003.jpg

  網(wǎng)上書(shū)店系統(tǒng)可以實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接和相應(yīng)的操作?,F(xiàn)通過(guò)向用戶表中添加一個(gè)用戶數(shù)據(jù)舉例如下。

  假定要添加一個(gè)名為“香成”的用戶信息,首先在Oracle數(shù)據(jù)庫(kù)中查看userinfo表中有無(wú)這個(gè)用戶。結(jié)果如下圖4所示。

004.jpg

  接著,在網(wǎng)上書(shū)店系統(tǒng)中注冊(cè)一個(gè)用戶“香成”,然后在Oracle數(shù)據(jù)庫(kù)中查看是否已經(jīng)添加該用戶,具體如圖5、圖6所示。

005.jpg

  最后,用該用戶登錄網(wǎng)站,并成功登錄。如圖7所示。

  上述試驗(yàn)結(jié)果表明,通過(guò)基于DAO模式的Hibernate設(shè)計(jì)方法很好地完成了該Web系統(tǒng)的數(shù)據(jù)層設(shè)計(jì)。

5 總結(jié)

  基于DAO的設(shè)計(jì)通常對(duì)業(yè)務(wù)邏輯層提供一個(gè)通用的接口調(diào)用,同時(shí)其內(nèi)部實(shí)現(xiàn)了一個(gè)特定的持久策略,例如采用Hibernate進(jìn)行持久化操作。通過(guò)DAO層的抽象,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開(kāi)來(lái),實(shí)現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合。從而使得在改變DAO實(shí)現(xiàn)代碼時(shí)不會(huì)影響業(yè)務(wù)層的調(diào)用,優(yōu)化了數(shù)據(jù)訪問(wèn),增強(qiáng)系統(tǒng)的可擴(kuò)展性和維護(hù)性。

參考文獻(xiàn)

  [1] 陶俑,李曉軍.Hibernate ORM最佳實(shí)踐[M].北京:清華大學(xué)出版社,2007.

  [2] BERRY C A, JOHNCARNELL. J2EE Design Patterns Applied[M]. Birmingham: Wrox Press, 2002.

  [3] 陳松.J2EE電子商務(wù)系統(tǒng)開(kāi)發(fā)從入門(mén)到精通:基于Struts和Hibernate技術(shù)實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,2007.

  [4] 錢(qián)忠勝.基于Hibernate的數(shù)據(jù)持久化研究及其應(yīng)用[J].微計(jì)算機(jī)信息,2007,23(24):242-244.

  [5] ALLAMARAJU S. Professional Java server programming J2EE l.3[M]. Birmingham: Wrox Press, 2001.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。