基于Spring和Hibernate数据访问技术研究与应用
2011-02-09程显生郭艳光
程显生,郭艳光
(内蒙古农业大学职业技术学院 信息管理系,包头 014109)
0 引言
目前,在企业应用开发环境中,面向对象开发方法成为主流。数据持久化工作是不可或缺的部分,而且也是面向对象开发方法研究的主要方面。在应用程序开发中,三层体系结构模式能更灵活、更快速地开发强大的网络应用程序系统。三层体系结构模式主要包括表示层、中间逻辑层和数据访问层。表示层是提供给用户的交互界面,便于客户理解;中间逻辑层包括业务规则层、业务实体层和系统框架层。数据访问层是定义、维护、访问和更新数据,也称该层为持久层。
在三层体系结构模式中,业务规则层是验证业务实体是否对相应的数据有访问权限,确保整个系统的底层安全。业务实体层是利用Spring 应用接口提供对各个业务实体进行数据访问功能,相当于为数据库的数据包装了一层壳,增加数据库访问的统一性,提高整个系统的安全性。系统框架层是读取和设置整个系统的配置信息,记录和管理系统日志,提供统一的底层功能。数据访问层是为业务层提供数据访问功能,作为数据库与业务层的接口,通过Hibernate的ORM元素,把对象持久化到关系数据库中。
1 Spring和Hibernate技术原理及特点
1.1 Spring 容器框架
Spring是指一个用于构造Java应用程序的轻量级容器框架,它的核心基于“控制反转(Inversion of Control,IoC)”原理。IoC是一种将组件依赖关系的创建和管理置于程序外部的技术,它有另一个含义更明确的名字称“依赖注入(Dependency Injection,DI)”DI带来的最大的好处一是消除连接应用程序的各个部件而编写的大量代码;二是将依赖配置外置并重新配置你的业务对象的依赖关系;三是提高可测试性,利用DI可以为数据访问对象(Date Access Object,DAO)创建一个模拟实现,然后指导它传递给业务对象进行测试;四是DI中所有的主要组件都是定义为接口的,这些接口已在DI容器创建并糅合到一起,开发人员将精力集中建立业务逻辑,无需考虑业务的框架。
1.2 Hibernate对象持久化框架
Hibernate是“对象—关系映射(Object—Relational Mapping,ORM)模块实现数据持久层的一个优秀的Java组件。ORM元素主要功能是实现实体域对象的持久化并封装[7]数据访问的细节。本文的党员数据库管理系统中主要通过DAO和ORM元素实现数据的持久化操作,如图1所示。
图1 通过DAO和ORM组件实现数据的持久化
DAO采用HibernateDaoSupport类开发。HibernateDaoSupport类提供相关的属性和
方法并进行封装。为此直接使用HibernateTemplate进行数据对象的访问和操作。通过XML序列化和反序列化实现持久化数据对象的方法。XML序列化是将应用程序数据对象的公共属性和字段转换为XML文档以便存储或传输。反序列化则是从 XML 输出中重新创建原始状态的对象,最终将反序列化的数据对象转换为应用程序数据。
2 数据库管理系统的设计与开发过程
2.1 数据库管理系统的设计
本文建立的某高校党员信息管理系统,是选用SQL Server2005创建和管理数据库,数据库,数据库中的表主要存放党员信息的表memberINF,主要包括人员编号、姓名、性别、民族、出生日期、入党时间、党内职务、申请时间、培养时间、预审通过时间、支部大会通过时间等列名,该系统利用映射文件定义类和属性,类和类属性映射到数据库的表和表字段,即通过映射来表示不同的表关联。因此,Hibernate就可以持久化这些类和类属性到数据库中并通过Hibernate的HQL语言实现对数据库数据的CRUD(Create/Read/Update/Delete)操作即实现对数据库数据的增加、修改、删除等编辑操作。
2.2 数据库管理系统的开发过程
在党员管理系统的开发过程中,采用基于.NET版本的Spring编写数据访问层配置文件Dao.xml,完成数据访问层填充实体数据的序列化和接收客户端数据实体,并提供给数据访问层;采用基于.NET版本的Hibernate数据访问层实现对实体定义,并完成Hibernate的最终数据实体化。同时,Hibernate数据访问层主要通过Hibernate的映射文件完成数据库表中数据相互转化和持久化,最后完成数据的CRUD操作。下面以表memberINF为例,实现数据持久化的过程,具体过程如下:
1)Dao.xml文件的编写
<!-- Database and NHibernate Configuration -->
<db:provider id="DbProvider"provider="SqlServer-3.0" connectionString="Data Source=.;Integrated Security=false;Data base=PermissionBase;User ID=PB_DB_USER;Password=1234567890"/>
<objectid="NHibernateSessionFa ctory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider"ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Fire.GXDY.Dao.NHibernate</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
</property>
……
<object id="HibernateTransactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
<property name="DbProvider"ref="DbProvider"/>
<property name="SessionFactory" ref="NHibern ateSessionFactory"/>
</object>
<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
<property name="SessionFactory"ref="NHibernateSessionFactory" />
<property name="TemplateFlushMode"value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<!-- Data Access Objects -->
…..
<objectid="MemberINFDao" type="Fire.GXDY.Dao.NHibernate.HibernateMemberINFDao,Fire.GXDY.Dao.NHibernate">
<property name="HibernateTemplate"ref="HibernateTemplate"/>
</object>
</objects>
2)数据访问对象DAO接口编写
public interface IMemberINF
{
MemberINF FindById(string Id);
IList FindAll();
IList FindByDepartmnetId(string id);
MemberINF Save(MemberINF member);
MemberINF SaveOrUpdate(MemberINF member);
void Delete(MemberINF member);
}
3)数据实体的CURD操作编写。
public MemberINF FindById(string Id)
{
HibernateTemplate.SessionFactory.EvictQueries("MemberINF");
HibernateTemplate.SessionFactory.Close();
HibernateTemplate.SessionFactory.OpenSession();
return HibernateTemplate.Load(typeof(MemberINF), Id) as MemberINF;
}
public IList FindAll()
{
HibernateTemplate.SessionFactory.EvictQueries("MemberINF");
HibernateTemplate.SessionFactory.Close();
HibernateTemplate.SessionFactory.OpenSession();
return HibernateTemplate.LoadAll(typeof(MemberINF));
}
……
public void Delete(MemberINF member)
{
HibernateTemplate.SessionFactory.EvictQueries("MemberINF");
HibernateTemplate.Delete(member);
}
4)映射文件的编写
<hibernate-mapping xmlns="urn:nhibernatemapping-3.2" namespace="Fire.GXDY.Daomain"assembly="Fire.GXDY.Dao">
<class name="MemberINF" table="MemberINF"proxy="MemberINF">
<cache usage="read-write" />
<id name="Id" column="ID" type="String"length="15">
<generator class="assigned" />
</id>
<property name="Name" type="String">
<column name="Name" length="20" notnull="false"/>
</property>
<property name="Sex" type="String">
<column name="Sex" length="2" notnull="false"/>
</property>
<property name="Nation" type="String">
<column name="Nation" length="20" notnull="false"/>
</property>
……
5)实例注入编写
public interface IMemberINFSrv
{
void DeleteMemberINF(string id);
System.Collections.IList GetAllMemberINF();
System.Collections.IList FindByDepartmnetId(string id);
Fire.GXDY.Daomain.MemberINF GetMemberINFById(string id);
string InsertMemberINF(Fire.GXDY.Daomain.MemberINF member);
string UpdateMemberINF(Fire.GXDY.Daomain.MemberINF member);
}
6)属性和方法封装并序列化给客户端
public class MemberINFSrv:Fire.GXDY.Service.IMemberINFSrv
{
private IMemberINF memberINFDao;
public IMemberINF MemberINFDao
{
get { return memberINFDao; }
set { memberINFDao = value; }
}
……
public string InsertMemberINF(MemberINF member)
{
if (member != null)
{
MemberINF tempMember = MemberINFDao.FindById(member.Id);
if (tempMember != null&&tempMember.Id.Length>0) return "-2";
member.Id = IdGen.GetNextId(typeof(MemberINF));
member.Department = DepartmentDao.FindById(member.DepartmentId);
MemberINFDao.Save(member);
return "1";
}
return "-1";
}
3 结论
本文主要介绍了Spring和Hibernate技术的原理和特点并结合实际的实例,实现业务实体层、数据实体层、数据访问层及映射文件的定义、维护等操作。利用Spring的依赖注入技术创建和定义数据访问对象DAO和接口,实现业务逻辑的编写,提供统一的数据访问功能;利用Hibernate的对象关系映射ORM将数据对象与数据实体联系,实现数据持久化操作。
Hibernate作为当今新兴的、最受人瞩目的数据库访问技术,提供了一种很好的数据持久层解决方案,使得开发人员真正从繁重的代码编写工作中解脱出来,极大地提高了开发效率和项目质量。Spring利用控制反转、依赖注入特征使你能够编写更干净、更可管理、并且更易于测试的代码。
[1] 张千,王华东.基于三层结构的船舶办公自动化系统的设计梁鸿[J].微计算机应用,2006,6.
[2] 郭锋.Spring 从入门到精通[M].北京:清华大学出版社,2007:230-260.
[2] 荣林.基于Hibernate性能优化研究[J].计算机工程与设计,2008,29(7):1739-1744.
[3] 陶勇.Hibernate ORM最佳实践[M].北京:清华大学出版,2010:156-160.
[4] 严海.基于Struts Spring Hibernate框架构建WEB应用的设计与实现[D].西安科技大学,2010:10-84.
[5] 刘壮.基于Spring+Hibernate的开发方法研究及实例[D].吉林大学,2005:32-38.
[6] 宫曌.基于开源框架的CRM系统研究及开发[D].中南大学,2007:16-17.
[7] 高昂,卫文学.基于Hibernate与Struts框架的数据持久化应用研究[J].计算机应用,2005,25(12):2818-2819.