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

王正玉,,李 斌

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

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

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

0 引言

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

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

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

1 Hibernate原理及應用

  1.1 Hibernate技術(shù)的原理

  Hibernate是個獨立的對象關(guān)系映射系統(tǒng)(ORM)的持久化框架,它本身不依賴于Web服務器(如Tomcat)或應用服務器(如JBoss)的支持,。Hibernate實質(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)通常以中間件的形式存在,主要實現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射,。ORM具有實體映射,、關(guān)系映射、高級查詢,、事物處理,、實體類和操作類的生成等五大特征。

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

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

001.jpg

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

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

  1.3 Hibernate的核心接口

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

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

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

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

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

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

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

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

 ?。?)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)

  ),;

 ?。?)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)

 ?。?;

  (4)訂購表order1,,存放當前已交易的訂單信息,。創(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,,//當前發(fā)貨狀態(tài)

  PRIMARY KEY(id)

 ?。?/p>

 ?。?)評價表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)

  ),;

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

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

006.jpg

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

2 DAO模式的介紹

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

002.jpg

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

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

3 基于DAO模式的Hibernate設計及應用

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

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

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

003.jpg

  網(wǎng)上書店系統(tǒng)可以實現(xiàn)與數(shù)據(jù)庫的連接和相應的操作?,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所示。

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

5 總結(jié)

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

參考文獻

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

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

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

  [4] 錢忠勝.基于Hibernate的數(shù)據(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)載,。