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

王正玉,李 斌

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

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

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

0 引言

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

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

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

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

  1.1 Hibernate技術(shù)的原理

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

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

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

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

001.jpg

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

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

  1.3 Hibernate的核心接口

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

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

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

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

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

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

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

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

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

  CREATE TABLE bookinfo(

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

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

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

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

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

  intro varchar2(150),,//簡介

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

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

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

  date1 date NOT NULL,,//日期

  PRIMARY KEY(id)

 ?。?/p>

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

  CREATE TABLE remark(

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

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

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

  grade number(3)NOT NULL,,

  remark varchar2(50)NOT NULL,

  date1 date NOT NULL,,

  PRIMARY KEY(id)

 ?。?/p>

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

  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),,//用戶等級

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

  PRIMARY KEY(id)

  ),;

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

  CREATE TABLE order1(

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

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

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

  number1 number(3)NOT NULL,,//銷量

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

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

  orderdate date NOT NULL,,//訂購日期

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

  PRIMARY KEY(id)

 ?。?;

  (5)評價表remark存放書籍的相關(guān)評價信息,。創(chuàng)建該表的Oracle語句如下:

  CREATE TABLE remark(

  id number(10)NOT NULL,,//評價信息ID

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

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

  grade number(3)NOT NULL,,//評價等級

  remark varchar2(50)NOT NULL,//評價內(nèi)容

  date1 date NOT NULL,,//評價日期

  PRIMARY KEY(id)

 ?。?/p>

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

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

006.jpg

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

2 DAO模式的介紹

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

002.jpg

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

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

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

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

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

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

003.jpg

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

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

004.jpg

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

005.jpg

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

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

5 總結(jié)

  基于DAO的設(shè)計通常對業(yè)務(wù)邏輯層提供一個通用的接口調(diào)用,,同時其內(nèi)部實(shí)現(xiàn)了一個特定的持久策略,例如采用Hibernate進(jìn)行持久化操作,。通過DAO層的抽象,,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開來,實(shí)現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合,。從而使得在改變DAO實(shí)現(xiàn)代碼時不會影響業(yè)務(wù)層的調(diào)用,,優(yōu)化了數(shù)據(jù)訪問,增強(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)開發(fā)從入門到精通:基于Struts和Hibernate技術(shù)實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,,2007.

  [4] 錢忠勝.基于Hibernate的數(shù)據(jù)持久化研究及其應(yīng)用[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)載,。