王正玉,李斌
(安徽廣播電視大學(xué)遠程教育技術(shù)與圖文信息中心圖書館,安徽合肥230022)
基于DAO模式的Hibernate框架在Java Web開發(fā)中的應(yīng)用*
王正玉,李斌
(安徽廣播電視大學(xué)遠程教育技術(shù)與圖文信息中心圖書館,安徽合肥230022)
Hibernate是目前Java領(lǐng)域中最受歡迎的OR映射開源框架,它的出現(xiàn)使程序員得以擺脫編寫繁瑣SQL語句的麻煩,將更多的精力用于業(yè)務(wù)邏輯的設(shè)計。DAO即數(shù)據(jù)訪問對象,其目的是實現(xiàn)一種用來操作數(shù)據(jù)源的訪問機制。通過DAO層的抽象,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開來,實現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合,即使改變DAO實現(xiàn)代碼也不會影響業(yè)務(wù)層的調(diào)用。通過案例,對基于DAO模式的Hibernate框架技術(shù)進行了介紹。
Hibernate;DAO模式;數(shù)據(jù)持久;框架
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ù)訪問對象,主要為了實現(xiàn)一種用來操作數(shù)據(jù)源的訪問機制。數(shù)據(jù)源可以是RDBMS關(guān)系數(shù)據(jù)庫、LDAP目錄服務(wù)器、XML文件等。依賴于DAO的業(yè)務(wù)組件為其客戶端使用DAO提供更簡單的接口[1]。
本文采用一種基于DAO的Hibernate的設(shè)計模式來實現(xiàn)在J2EE開發(fā)[2]的數(shù)據(jù)層表示,數(shù)據(jù)庫為Oracle 10g數(shù)據(jù)庫。并通過編寫例程的方式詳細介紹Hibernate和DAO的原理、技術(shù)及開發(fā)步驟等。
1.1 Hibernate技術(shù)的原理
Hibernate是個獨立的對象關(guān)系映射系統(tǒng)(ORM)的持久化框架,它本身不依賴于Web服務(wù)器(如Tomcat)或應(yīng)用服務(wù)器(如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所示。
圖1Hibernate持久化結(jié)構(gòu)
從圖1中可以看出,應(yīng)用層抽象出業(yè)務(wù)的POJO(Plain Ordinary Java Objects)對象并通過Hibernate及映射文件的定義來實現(xiàn)其業(yè)務(wù)對象的持久化管理。
Hibernate有兩類[4]重要文件,一類是配置文件(擴展名為.cfg.xml),另一類是映射文件(擴展名為.hbm.xml)。映射文件的主要作用是告訴Hibernate如何把POJO對象持久到數(shù)據(jù)庫中。配置文件的作用是對Hibernate環(huán)境進行配置,這里包括使用的數(shù)據(jù)庫或數(shù)據(jù)源等信息。
1.3 Hibernate的核心接口
在Hibernate中,其核心接口主要有以下五個:
(1)Configuration接口。該類抽象了負責(zé)加載Hibernate的配置及映射信息,一個Configuration對象實例代表一個應(yīng)用程序中Java類型到SQL數(shù)據(jù)庫映射的完整集合,Configuration被用來構(gòu)建一個SessionFactory,映射定義則由不同的XML映射定義文件編譯而來。
(2)SessionFactory接口。其為一個Java接口,它是針對單個數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯得到的內(nèi)存鏡像。單個項目通常只需一個SessionFactory,當(dāng)該項目需操作多個數(shù)據(jù)庫時,必須為每個數(shù)據(jù)庫指定一個SessionFactory。
(3)Session接口。該接口對于開發(fā)人員來說很重要,表示應(yīng)用程序與數(shù)據(jù)持久層之間交互操作的一個單線程對象,此對象生存期很短。其隱藏了JDBC連接,同時也是Hibernate事務(wù)(Transcation)的工廠。
(4)Transaction接口。Hibernate通過Transaction來聲明事務(wù)邊界。Hibernate可以配置為JDBC、JTA或CMT三種事務(wù)之一。
(5)Query。在Hibernate中,HQL語言是Hibernate提供的一個非常強大的面向?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)
);
(2)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)
);
(3)用戶表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,存放當(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)
);
1.5 Hibernate技術(shù)的開發(fā)步驟及應(yīng)用
Hibernate的開發(fā)步驟大體分為三步:(1)持久化類的設(shè)計。所謂的持久化類是指POJO類。(2)持久化類和關(guān)系數(shù)據(jù)庫的映射。(3)應(yīng)用的開發(fā)。
本文按照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ù)中進行相關(guān)應(yīng)用開發(fā)。
表1 Web系統(tǒng)數(shù)據(jù)層設(shè)計中表與持久化類對應(yīng)關(guān)系
數(shù)據(jù)訪問對象模型(Data Access Object)負責(zé)溝通數(shù)據(jù)庫,處于業(yè)務(wù)邏輯層與數(shù)據(jù)源之間,是一種抽象數(shù)據(jù)源,其目的是為了提供業(yè)務(wù)邏輯對數(shù)據(jù)的透明訪問。具體模式結(jié)構(gòu)如圖2所示。
圖2 DAO模式結(jié)構(gòu)
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ù)源之間的差異,從而實現(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接口的實現(xiàn)類,負責(zé)DAO接口對不同數(shù)據(jù)源的實現(xiàn);(3)傳遞與DAO層的數(shù)據(jù)訪問對象(域?qū)ο蠡蛑祵ο螅4娴氖菢I(yè)務(wù)狀態(tài)數(shù)據(jù);(4)DAO工廠類,負責(zé)創(chuàng)建不同業(yè)務(wù)領(lǐng)域的DAO對象。
在基于DAO模式的Hibernate設(shè)計中,數(shù)據(jù)訪問都是通過DAO層封裝實現(xiàn)的。每個DAO實例都是為一個域?qū)ο蠓?wù);每一個獨立的域?qū)ο蠖加邢鄳?yīng)的DAO實現(xiàn);DAO的職責(zé)是對域?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類。上述接口類分別對應(yīng)著各自的接口實現(xiàn)類,分別為UserDaoImpl子類、IorderDaoImpl子類、IBookDaoImpl子類、IBaseDaoImpl子類。
通過這種基于DAO模式的Hibernate設(shè)計方法,完成了網(wǎng)上書店系統(tǒng)的數(shù)據(jù)層設(shè)計工作。系統(tǒng)運行的主界面如圖3所示。
圖3 網(wǎng)上書店系統(tǒng)主界面
網(wǎng)上書店系統(tǒng)可以實現(xiàn)與數(shù)據(jù)庫的連接和相應(yīng)的操作。現(xiàn)通過向用戶表中添加一個用戶數(shù)據(jù)舉例如下。
假定要添加一個名為“香成”的用戶信息,首先在Oracle數(shù)據(jù)庫中查看userinfo表中有無這個用戶。結(jié)果如下圖4所示。
圖4 查詢結(jié)果
接著,在網(wǎng)上書店系統(tǒng)中注冊一個用戶“香成”,然后在Oracle數(shù)據(jù)庫中查看是否已經(jīng)添加該用戶,具體如圖5、圖6所示。
最后,用該用戶登錄網(wǎng)站,并成功登錄。如圖7所示。
圖5 用戶注冊
圖6 添加用戶
圖7 成功登錄
上述試驗結(jié)果表明,通過基于DAO模式的Hibernate設(shè)計方法很好地完成了該Web系統(tǒng)的數(shù)據(jù)層設(shè)計。
基于DAO的設(shè)計通常對業(yè)務(wù)邏輯層提供一個通用的接口調(diào)用,同時其內(nèi)部實現(xiàn)了一個特定的持久策略,例如采用Hibernate進行持久化操作。通過DAO層的抽象,將具體的業(yè)務(wù)邏輯層和數(shù)據(jù)持久層區(qū)分開來,實現(xiàn)了系統(tǒng)與特定數(shù)據(jù)源的松耦合。從而使得在改變DAO實現(xiàn)代碼時不會影響業(yè)務(wù)層的調(diào)用,優(yōu)化了數(shù)據(jù)訪問,增強系統(tǒng)的可擴展性和維護性。
[1]陶俑,李曉軍.Hibernate ORM最佳實踐[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ù)實現(xiàn)[M].北京:清華大學(xué)出版社,2007.
[4]錢忠勝.基于Hibernate的數(shù)據(jù)持久化研究及其應(yīng)用[J].微計算機信息,2007,23(24):242-244.
[5]ALLAMARAJUS.ProfessionalJavaserverprogramming J2EE l.3[M].Birmingham:Wrox Press,2001.
Application of the DAO pattern based Hibernate framework in Java Web development
Wang Zhengyu,Li Bing
(Distance Education Technology and Information Center and Library,Anhui Radio and TV University,Hefei 230022,China)
Hibernate is one of the most popular object-relational mapping framework in Java field.It makes programmers focus more on the design of the business logic instead of coding complex SQL statements.Data Access Object can separate the specific business logic from the data persistence by its abstraction,to realize a loose coupling structure between system and specific data source.Even if the DAO implementation code changes,it will not affect the business layer calls.Through the case,this article makes an introduction of this technology with DAO pattern.
Hibernate;DAO pattern;data persistence;framework
TP311
A
1674-7720(2015)11-0014-04
2015-01-09)
王正玉(1985-),男,碩士,助理工程師,主要研究方向:數(shù)字圖像處理。
安徽省教育廳自然科學(xué)基金項目(KJ2014A081)