首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何正确地应用对象/关系映射技术实现应用系统持久层中的各个DAO组件

软件项目实训及课程设计指导——如何正确地应用对象/关系映射(O/R Mapping)技术实现应用系统持久层中的各个DAO组件

1、了解软件应用系统持久层实现中的对象/关系映射技术

(1)对象/关系映射(O/R Mapping)技术产生的背景

在J2EE系统平台中,面向对象OOP技术中的对象实例数据(属性或者状态)的持久化操作的方式其实是多样化的,这包括序列化/反序列化、保存为XML格式(也还应该属于序列化,目前还可以保存为JSon格式的文本文件等)和保存为关系数据库表等形式。而对于保存为关系数据库表这样的持久化形式,一般采用对象/关系映射技术实现。

(2)什么是对象/关系映射(O/R Mapping)技术

对象/关系映射技术的本质,其实是一种“适配器”形式的转换技术,它主要能够对数据实现如下形式的双向转换:

1)把面向对象程序中的类转换为物理数据库系统中的数据库表

2)将类中的各个成员属性转换到对应的物理数据库系统中的数据库表内的字段

3)物理数据库系统中的数据库表内的某条记录转换为某个实体类的对象实例

4)对象之间的各种关系转换为物理数据库系统中的数据库表之间的关系。

当然,这种转换是双向的!下图所示是这种双向转换的原理图示的局部截图。

(3)为什么要提供对象/关系映射(O/R Mapping)技术

由于关系数据库系统仍然是目前企业软件应用系统中使用最广泛的数据存储媒介,在实现“关系模型”的各种物理数据库系统(如Oracle、MS SQLServer、DB2等)中存储的是关系形式的数据和这些关系数据的静态结构,它主要包括以下内容:

1)数据库表、表索引、视图、触发器

2)表与表之间的关系参照完整性说明

而面向对象分析和设计中的“对象模型”是由以下内容组成:

1)具有状态属性和行为方法的域对象;

2)各个域对象实体类之间的关系(关联、依赖、聚集、组合和泛化)。

正是由于“关系模型”和“对象模型”两者在设计思想、设计原则和具体的技术实现方式、存储的内容等方面都有明显的差别,有必要将两者都转换为某一种统一的形式!从而可以采用统一的形式对这两种不同形式的数据进行访问,简化数据访问的复杂性和减少重复性地开发工作。

而目前的软件开发过程从软件应用系统的需求描述、需求分析,系统设计和系统实现、乃至系统测试等阶段都运用面向对象的思想和设计方法、编程实现技术,很显然有必要对常规方式下的软件应用系统开发实现中的系统持久层的数据库系统操作访问的编程实现方式进行改造,期望也能够应用面向对象的方式进行。

基于此目的,对象/关系映射(O/R Mapping)技术及相应的支持框架(包括商业和开源)、实现工具等在J2EE平台中都相继地出现了。如下示图为支持对象/关系映射(O/R Mapping)技术的Hibernate应用框架的官方页面信息的局部截图。

因此,运用对象/关系映射(O/R Mapping)技术去开发数据库相关的应用,首先可以节省大量的工作量,特别是减少了烦琐的SQL语句的编写;其次,能够以对象为单位进行相应的数据库操作,而在JDBC API相关实现技术中是以对象的属性为单位。数据操作不仅简单,而且数据的“粒度”更大。

2、J2EE系统平台中的对象/关系映射技术有多种实现的方法和形式

对象/关系映射(O/R Mapping)的思想及具体的实现技术,其实在J2EE平台中早就存在和早已被应用——如J2EE EJB组件中的实体Bean组件,这包括容器管理持久性(CMP,Container-Managed Persistence)的CMP和Bean管理持久性(BMP,Bean-Managed Persistence)的BMP两种形式。

(1)J2EE EJB组件中的实体Bean组件 ——对象/关系映射实现之一

Sun公司(现在为Oracle公司)在J2EE EJB组件中的实体Bean组件的技术规范中提出了两种形式的实体Bean组件——容器管理持久性(CMP,Container-Managed Persistence)和 Bean管理持久性(BMP,Bean-Managed Persistence)组件。

其中在容器管理持久性的CMP组件中也应用了对象/关系映射思想、而且也是通过标准的XML配置文件定义两者之间的映射关系的信息、并且也都倡导把对象持久化的任务从软件应用系统的业务逻辑程序代码中分离出来。

但容器管理持久性的CMP组件技术和常规的轻量级的对象/关系映射(O/R Mapping)实现技术(如Hibernate应用框架等)相比,存在有以下几个方面的不足:

1)CMP实体EJB组件必须严格遵守J2EE系统平台的技术规范和编程实现要求,而常规的轻量级的对象/关系映射(如Hibernate应用框架等)的实现技术则是采用POJO(Plain Old Java Objects,简单的Java对象)形式的实体组件。

2)CMP实体EJB组件只能运行在支持J2EE EJB技术规范的EJB容器中,在开发过程中的单元测试则必须要模拟EJB容器环境或者直接在EJB容器中进行——而这是比较困难的和繁琐的实现过程;而采用POJO形式的普通实体组件,可以运行在任何一种Java运行的环境中,方便开发过程中的单元测试。

3)CMP实体EJB组件不能在J2EE? EJB容器之外运行,也就无法实施J2EE容器外的开发和单元测试;而应用POJO形式的实体组件则可以采用J2EE容器外(不必要运行在J2EE Servlet容器中)的开发实现方法。

(2)Java Data Objects(JDO)——对象/关系映射实现之二

Java Data Objects(JDO)是SUN公司制定的描述对象持久化语义的标准API,JDO提供了透明的对象存储实现技术,而复杂的对象存储具体实现的工作由JDO产品的各个具体提供商的程序完成。应用JDO同样也能够让软件应用系统的开发人员集中时间和精力完成软件应用系统中的业务逻辑功能实现。

如下示图为JDO模式的工作原理示图,在JDO模式中的整个应用分为四层次的应用结构。软件应用系统的开发人员在业务逻辑层组件中不需再应用结构化查询语言(SQL)语句操作访问数据库系统中的数据,因为JDO是作为Java数据库连接JDBC API的一个补充和完善,但JDO并不意味着要取代JDBC。它们是两种互相补充的应用技术,比如JDBC允许开发人员通过直接的数据库访问控制和缓存管理,从而提供给软件应用系统的开发人员更大的灵活性。

从此工作原理示图中可以了解到JDO比JDBC(只适用于面向关系数据库系统)更通用,因为它提供了到任何数据底层的存储功能实现的标准,比如关系数据库、文件形式的序列化、XML等形式,使得基于JDO实现的应用系统具有更好的可移植性。如下为官方网站中对JDO技术标准的详细介绍的资料页面的局部截图,读者可以浏览相关的技术帮助文档和下载与JDO相关的系统库。

(3)Hibernate应用框架——对象/关系映射实现之三

Hibernate应用框架是一个开放源代码的支持对象关系映射技术的框架,它对JDBC进行了非常轻量级的对象封装和优化,从而使得开发人员能够使用面向对象OOP的编程方法操作关系数据库系统中的数据。

Hibernate框架不仅提供了从Java持久类到物理数据库系统的数据表的映射,也提供了数据查询和事务等机制。应用Hibernate框架能够使得软件应用系统的设计人员达到持久层设计上的解耦——业务逻辑与数据逻辑相分离,从而使得业务逻辑层开发人员不需要考虑数据库表的逻辑结构、数据访问逻辑与物理数据库系统的结构相分离(数据访问逻辑的开发者不需要再关心不同的物理数据库系统之间的差异性);也能够使得软件应用系统的开发人员提高编码效率和提高数据库访问性能(因为在Hibernate应用框架中提供了对连接池、数据缓存等技术实现的支持)。

下图所示为Hibernate框架官方网站中下载其系统包文件的页面内容截图,读者可以在Hibernate框架官方网站中下载其系统JAR包文件,然后在软件应用系统项目中应用Hibernate框架。

(4)MyBatis框架——对象/关系映射实现之四

Hibernate应用框架能够根据开发人员在映射关系定义的XML配置文件中的有关信息自动地完成对目标数据库表的对象关系映射操作,这大大地简化了软件应用系统开发人员在软件应用系统的持久层功能实现方面的技术复杂度,这是Hibernate应用框架能够流行的一个主要原因。但也导致它缺少一定的灵活性!

因为在某些企业软件应用系统中,物理数据库系统的数据库表的结构并不是完全公开的或者是由其它合作企业设计好数据库表结构,另外也可能要求提高数据访问的性能等方面的原因。此时软件应用系统的设计和开发人员如果此时继续再应用Hibernate框架实现O/R Mapping方面的功能,则可能会出现不尽人意的效果。而面对这样的应用环境和需求,很多软件应用系统的开发人员一般又继续应用JDBC API编程实现系统中的这些功能。

而MyBatis框架则能够很好地解决这些问题,因为它不会在运行期自动地生成SQL语句并执行数据访问操作。继续要求软件应用系统的开发人员编写具体的SQL 语句,然后通过映射配置文件,将SQL语句中所需的参数和返回的结果字段映射到指定的POJO类对象中。下图所示为MyBatis的官方网站(作者浏览的是中文版本)上对MyBatis框架的功能描述截图。读者同样可以在MyBatis框架官方网站中下载其系统JAR包文件,然后在软件应用系统项目中应用MyBatis框架,更多的技术介绍读者可以浏览MyBatis框架官方网站页面。

3、应用Hibernate框架与直接应用JDBC API编程实现上的主要区别

(1)Hibernate应用框架其实是对JDBC API技术的轻量级对象封装

Hibernate应用框架也是一个独立的对象关系映射实现的持久层应用框架,它可以用在任何JDBC可以使用的场合。当Java系统平台中的某个软件应用系统需要从一种物理数据库系统环境移植到另一种物理数据库系统环境中时,只需要修改Hibernate应用框架中与物理数据库系统的数据库连接有关的XML配置文件,而不需要修改或者只需要修改极少量的Java源程序代码。

在MyEclipse开发工具中提供了对Hibernate框架的数据库连接配置文件的可视化操作的支持,请见下图所示的可视化操作界面。

(2)Hibernate应用框架采用XML文件来配置和定义对象/关系映射

开发人员在应用Hibernate框架实现对象和关系数据库之间的映射时,通常是编写一个XML文档来配置和定义对象/关系映射。但这个XML格式的映射文档被设计为易读的,并且可以手工修改。映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的,而非数据库表的定义。

此XML格式映射文件告诉 Hibernate 应用框架,它应该访问目标数据库系统中的哪个数据表以及应该使用数据库表中的哪些字段,另外Hibernate应用框架也需要通过此XML格式映射文件获得如何加载和保存持久化类的对象实例。如下示图为某个项目中的XML格式映射配置定义文件的示例局部截图。

应用XML格式文件来配置对象/关系映射,有以下几个方面的优点:

1)保证Hibernate应用框架既不会渗透到应用系统的上层域模型(业务处理层)中,也不会渗透到下层数据模型(数据库系统)中。

2)软件应用系统的开发人员可以独立设计域模型,不必强迫遵守任何企业所提供的某个系统平台的规范。

3)物理数据库系统的数据库设计人员可以独立设计数据模型,也不必强迫遵守任何的技术规范。

4)软件应用系统中的“对象/关系”映射的技术实现不依赖于任何程序代码,如果需要修改“对象/关系”映射,只需要修改相关的XML格式的配置定义文件,不需要修改任何的程序代码,提高了软件应用系统的灵活性,并且使软件应用系统的维护更加方便。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201130A0CNUM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com