王正玉,李 斌
(安徽廣播電視大學 遠程教育技術與圖文信息中心 圖書館,安徽 合肥 230022)
摘 要: Hibernate是目前Java領域中最受歡迎的OR映射開源框架,它的出現使程序員得以擺脫編寫繁瑣SQL語句的麻煩,將更多的精力用于業務邏輯的設計。DAO即數據訪問對象,其目的是實現一種用來操作數據源的訪問機制。通過DAO層的抽象,將具體的業務邏輯層和數據持久層區分開來,實現了系統與特定數據源的松耦合,即使改變DAO實現代碼也不會影響業務層的調用。通過案例,對基于DAO模式的Hibernate框架技術進行了介紹。
關鍵詞: Hibernate;DAO模式;數據持久;框架
0 引言
OR Mapping對象關系映射技術在Java領域中已經取得廣泛的應用。Hibernate則是該領域中最受歡迎的OR映射開源框架,Hibernate技術使程序員得以擺脫編寫繁瑣SQL語句的麻煩,使其將更多精力應用于業務邏輯的設計。
DAO(Data Access Object)即數據訪問對象,主要為了實現一種用來操作數據源的訪問機制。數據源可以是RDBMS關系數據庫、LDAP目錄服務器、XML文件等。依賴于DAO的業務組件為其客戶端使用DAO提供更簡單的接口[1]。
本文采用一種基于DAO的Hibernate的設計模式來實現在J2EE開發[2]的數據層表示,數據庫為Oracle 10g數據庫。并通過編寫例程的方式詳細介紹Hibernate和DAO的原理、技術及開發步驟等。
1 Hibernate原理及應用
1.1 Hibernate技術的原理
Hibernate是個獨立的對象關系映射系統(ORM)的持久化框架,它本身不依賴于Web服務器(如Tomcat)或應用服務器(如JBoss)的支持。Hibernate實質上是一種對象關系映射工具,即它的原理就是ORM[3]。
ORM是一種為了解決面向對象與關系數據庫存在的互不匹配問題而出現的一種技術。簡單地說,ORM是通過使用描述對象和數據庫之間映射的元數據,將Java程序中的對象自動持久到關系數據庫中。ORM是隨著面向對象的軟件開發方法的發展而產生的。ORM系統通常以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射。ORM具有實體映射、關系映射、高級查詢、事物處理、實體類和操作類的生成等五大特征。
1.2 Hibernate的體系結構
Hibernate主要由持久化對象、配置文件和對象關系映射文件構成。如下圖1所示。
從圖1中可以看出,應用層抽象出業務的POJO(Plain Ordinary Java Objects)對象并通過Hibernate及映射文件的定義來實現其業務對象的持久化管理。
Hibernate有兩類[4]重要文件,一類是配置文件(擴展名為.cfg.xml),另一類是映射文件(擴展名為.hbm.xml)。映射文件的主要作用是告訴Hibernate如何把POJO對象持久到數據庫中。配置文件的作用是對Hibernate環境進行配置,這里包括使用的數據庫或數據源等信息。
1.3 Hibernate的核心接口
在Hibernate中,其核心接口主要有以下五個:
(1)Configuration接口。該類抽象了負責加載Hibernate的配置及映射信息,一個Configuration對象實例代表一個應用程序中Java類型到SQL數據庫映射的完整集合,Configuration被用來構建一個SessionFactory,映射定義則由不同的XML映射定義文件編譯而來。
(2)SessionFactory接口。其為一個Java接口,它是針對單個數據庫映射關系經過編譯得到的內存鏡像。單個項目通常只需一個SessionFactory,當該項目需操作多個數據庫時,必須為每個數據庫指定一個SessionFactory。
(3)Session接口。該接口對于開發人員來說很重要,表示應用程序與數據持久層之間交互操作的一個單線程對象,此對象生存期很短。其隱藏了JDBC連接,同時也是Hibernate事務(Transcation)的工廠。
(4)Transaction接口。Hibernate通過Transaction來聲明事務邊界。Hibernate可以配置為JDBC、JTA或CMT三種事務之一。
(5)Query。在Hibernate中,HQL語言是Hibernate提供的一個非常強大的面向對象的查詢語言,其語言特性與SQL語言非常類似。
1.4 例程數據庫設計
在本文設計的網上書店系統中,其數據庫中共有五張表:
(1)bookinfo表,存儲書籍相關信息。創建該表的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表,存放書籍相關折扣信息。創建該表的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,存放用戶相關信息。創建該表的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,存放當前已交易的訂單信息。創建該表的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,//當前發貨狀態
PRIMARY KEY(id)
);
(5)評價表remark存放書籍的相關評價信息。創建該表的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,//評價內容
date1 date NOT NULL,//評價日期
PRIMARY KEY(id)
);
1.5 Hibernate技術的開發步驟及應用
Hibernate的開發步驟大體分為三步:(1)持久化類的設計。所謂的持久化類是指POJO類。(2)持久化類和關系數據庫的映射。(3)應用的開發。
本文按照Hibernate的開發步驟設計了網上書店系統的數據層。將數據庫中表與持久化類一一對應,對應關系如表1所示。在對應類中,設置對應表的相應字段的變量及獲取,設置該字段值的方法。接著在各自持久化類對應的.hbm.xml映射文件中,設置了各自類與其對應的表的映射環境參數。最后再在基于DAO模式的技術中進行相關應用開發。
2 DAO模式的介紹
數據訪問對象模型(Data Access Object)負責溝通數據庫,處于業務邏輯層與數據源之間,是一種抽象數據源,其目的是為了提供業務邏輯對數據的透明訪問。具體模式結構如圖2所示。
DAO模式揭示了應用系統與數據源之間的關系。可以看到,應用系統可以包含一個或多個數據訪問對象,并且數據訪問對象可以訪問不同的數據源。對于Web應用而言,數據訪問對象隔離了不同數據源之間的差異,從而實現了業務邏輯層與數據源之間的解耦。
DAO模式是標準的J2EE設計模式[5]之一。典型的DAO由以下幾個組件構成:(1)DAO數據訪問接口,作為外界訪問數據對象的統一接口;(2)DAO接口的實現類,負責DAO接口對不同數據源的實現;(3)傳遞與DAO層的數據訪問對象(域對象或值對象),保存的是業務狀態數據;(4)DAO工廠類,負責創建不同業務領域的DAO對象。
3 基于DAO模式的Hibernate設計及應用
在基于DAO模式的Hibernate設計中,數據訪問都是通過DAO層封裝實現的。每個DAO實例都是為一個域對象服務;每一個獨立的域對象都有相應的DAO實現;DAO的職責是對域對象進行CRUD(即Create、Read、Update、Delete)操作;DAO允許通過簡單的查找方法來返回一組域對象。在DAO對象中,包含了對POJO類進行的操作。在DAO對象中調用了Hibernate的Configuraton、Session、Transaction、SessionFactory、Query等核心接口。本文例程中,DAO接口有四類,分別為UserDao類、IorderDao類、IBookDao類和IBaseDao類。上述接口類分別對應著各自的接口實現類,分別為UserDaoImpl子類、IorderDaoImpl子類、IBookDaoImpl子類、IBaseDaoImpl子類。
4 網上書店數據層結果展示
通過這種基于DAO模式的Hibernate設計方法,完成了網上書店系統的數據層設計工作。系統運行的主界面如圖3所示。
網上書店系統可以實現與數據庫的連接和相應的操作。現通過向用戶表中添加一個用戶數據舉例如下。
假定要添加一個名為“香成”的用戶信息,首先在Oracle數據庫中查看userinfo表中有無這個用戶。結果如下圖4所示。
接著,在網上書店系統中注冊一個用戶“香成”,然后在Oracle數據庫中查看是否已經添加該用戶,具體如圖5、圖6所示。
最后,用該用戶登錄網站,并成功登錄。如圖7所示。
上述試驗結果表明,通過基于DAO模式的Hibernate設計方法很好地完成了該Web系統的數據層設計。
5 總結
基于DAO的設計通常對業務邏輯層提供一個通用的接口調用,同時其內部實現了一個特定的持久策略,例如采用Hibernate進行持久化操作。通過DAO層的抽象,將具體的業務邏輯層和數據持久層區分開來,實現了系統與特定數據源的松耦合。從而使得在改變DAO實現代碼時不會影響業務層的調用,優化了數據訪問,增強系統的可擴展性和維護性。
參考文獻
[1] 陶俑,李曉軍.Hibernate ORM最佳實踐[M].北京:清華大學出版社,2007.
[2] BERRY C A, JOHNCARNELL. J2EE Design Patterns Applied[M]. Birmingham: Wrox Press, 2002.
[3] 陳松.J2EE電子商務系統開發從入門到精通:基于Struts和Hibernate技術實現[M].北京:清華大學出版社,2007.
[4] 錢忠勝.基于Hibernate的數據持久化研究及其應用[J].微計算機信息,2007,23(24):242-244.
[5] ALLAMARAJU S. Professional Java server programming J2EE l.3[M]. Birmingham: Wrox Press, 2001.