王正玉,李 斌
(安徽广播电视大学 远程教育技术与图文信息中心 图书馆,安徽 合肥 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.