(计算机系统结构专业论文)对象与关系数据库相互映射的c实现.pdf_第1页
(计算机系统结构专业论文)对象与关系数据库相互映射的c实现.pdf_第2页
(计算机系统结构专业论文)对象与关系数据库相互映射的c实现.pdf_第3页
(计算机系统结构专业论文)对象与关系数据库相互映射的c实现.pdf_第4页
(计算机系统结构专业论文)对象与关系数据库相互映射的c实现.pdf_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 目前随着计算机信息技术的发展,我们大量地使用关系数据库来管理我们的相 关信息,在管理这些信息的过程中,由于关系数据库本身的专业性,使得信息管 理人员不可能直接去操纵数据库,我们必须针对用户的需要开发数据库应用程序。 随着对象技术的普遍使用,应用程序现在基本上都是使用面向对象的语言进行开 发。由于关系数据库和对象是两种完全不同的技术,因此他们之间存在很大的耦 合性,为了尽量消除这种耦合性,对象关系数据库的映射技术孕育而生。 在中兴通讯股份有限公司本部事业部的传输网管产品中,我们使用关系数据 库- - s y b a s e 来管理各种传输设备盼信息;这些设备信息的结构基本类似,但由 于在光传输控制中,实时性的要求很高,因此为了提高数据库操作的速度,为每 一种设备在s y b a s e 数据库中都建立了一张对应的数据表。而对数据库进行操作 的应用程序是使用c + + 语言来开发的,这样一来在应用程序中,对各种设备的业务 处理方式就基本相同,但却需要针对相似的数据表写不同的业务逻辑类,这就使 得代码比较冗余,维护比较困难,在增加新设备时,也必须进行一些重复性的工 作,扩展性受到很大制约。为了克服这种缺点,我们提出了采用对象一关系数据 库的映射技术来解决这个问题,降低我们的程序和数据库之间的耦合性。但是由 于目前的对象一关系数据库映射软件基本上都是使用完全面向对象的语言开发 的,比如j a v a ,s m a l l t a l k 等等;使用用c + + 语言开发的对象一关系数据库映射软 件还未见有报道。因此,在本论文就是要介绍一个我们使用c + + 语言来实现的对象 关系数据库的映射工具。 文章首先对象一关系数据库映射的相关知识,让大家对这种技术的由来,实 现目标和特点有一个了解;然后阐述我们用c + + 语言来实现的对象一关系数据库映 射的设计思路,并介绍其c + + 语言实现的方案;最后我们将给出这个映射工具的测 试数据及其结果分析。 关键字:c + + 语言,o rm a p p i n g ,持久化,反射,x m l a b s t r a o t a l o n gw i t ht h ed e v e l o p m e n to ft h ec o m p u t e rt e c h n o l o g y ,w em a s s i v e l y u s et h er e l a t i o n a ld a t a b a s et om a n a g eo u ri n f o r m a t i o n s ,a n dw ec o n t r o lt h e s e i n f o r m a t i o n sw i t h t h e a p p l i c a t i o np r o g r a m n o w ,t h eo b j e c t o r i e n t e d t e c h n o l o g y i s w i d e l y u s e d b y t h ep r o g r a n n e r s b e c a u s et h er e l a t i o n a l d a t a b a s ea n dt h eo b j e c ta r et w ok i n do fc o m p l e t e l yd i f f e r e n tt e c h n o l o g i e s , t h ea p p l i c a t i o np r o g r a m sm i s m a t c ht h er e l a t i o n a ld a t a b a s e i no r d e rt o s o l v i n gt h ep r o b l e ma sf a ra sp o s s i b l e ,t h ep r o g r a m m e r sd e v e l o pan e w t e c h n o l o g y ,w h i c hi st h eo b j e c t r e l a t i o nd a t a b a s em a p p i n g ( 沪rm a p p i n g ) i nt h eo p t i c a l t r a n s p o r tp r o d u c t s o f h e a d q u a r t e r d i v i s i o no f z t e ( z h o n g x i n g t e l e c o m m u n i c a t i o n e q u i p m e n tc o ,l t d ) c o r p o r a t i o n ,w e m a n a g et h ei n f o r m a t i o n so ft h et r a n s p o r td e v i c e sw i t ht h es y b a s e ,w h i c hi s o n eo ft h er e l a t i o n a ld a t a b a s e t h es t r u c t u r e so ft h ed e v i c ei n f o r m a t i o n s i sv e r ys i m i l a r ,b u to u rp r o d u c t sa r es t r o n gr e a l t i m es y s t e m ,s ow ec a n t s t o r et h ei n f o r m a t i o n sw i t ht h es a m et a b l eo ft h ed a t a b a s e w em u s tc r e a t e at a b l ef o re a c hd e v i c et os t o r et h ed e v i c ed a t ai nt h ed a t a b a s e w ed e v e l o p t h ea p p l i c a t i o np r o g r a mw i t hc + + w h i c hi sak i n d o fo b j e c t o r i e n t e d l a n g u a g e i no r d e rt oh a n d l et h e s es i m i l a rd a t a ,w em u s tw r i t em a n ys i m i l a r c o d e si no u ra p p l i c a t i o np r o g r a m a sar e s u l t ,o u rc o d e si sv e r yr e d u n d a n t w e a r ed i f f i c u l tt om a i n t a i nt h e s ep r o g r a m s i no r d e rt os o l v i n gt h ep r o b l e m ,w e d e c i d et od e s i g nao _ rm a p p i n gt 0 0 1 a tp r e s e n t ,t h eo - rm a p p i n gt o o l sa r e d e v e l o p e db yp u r eo b j e c t o r i e n t e dl a n g u a g e ,s u c ha sj a v a ,s m a l l t a l k b u t ,w e m u s ti m p l e m e n tt h i s0 一rm a p p i n gt o o lw i t hc + + i nt h i st h e s i s ,a s s o c i a t e dk n o w l e d g ea b o u to - rm a p p i n gi si n t r o d u c e d f i r s t l y t h e nt h ed e s i g ni d e aa n di m p l e m e n t a t i o nm e t h o do ft h eo _ rm a p p i n g m o d e lw i t hc + + a r ea n a l y z e di nd e t a i l f i n a l l y t h et e s td a t aa n dt h er e s u l t a n a l y s i sa b o u tt h es o f t w a r ea r eg i v e n k e y v o r d s :c + + l a n g u a g e ,0 一rm a p p i n g ,p e r s i s t e n c e ,r e f l e c t i o n ,x m l i i 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。 签名:i i 盘日期;劲口6 年f 月7 日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:整垄导师签名: 日期:瑚0 6 年f 月7 日 第一章引言 1 1o - rm a p p l n g 的定义 第一章引言 o - r m a p p i n g 是o b j e c t r e l a t i o n d a t a b a s e m a p p i n g 的缩写,即对象一关系数据 库映射。它是在j 2 e e 中为了减少用户的业务逻辑受到数据库结构变化的影响而提 出的一种设计模式,其目的主要是为了将用户使用面向对象语言编写的对象直接 存储在关系数据库中。o rm a p p i n g 就是为了实现对象的持久化,即将对象存 储在某种持久机制中,如文本文件,关系数据库,对象数据库,对象一关系数据 库,层次数据库,网络数据库等等;同时还需要从这些永久机制中将对象还原出 来。这里的持久机制主要是指关系数据库,如s y b a s e ,o r a c l e ,s q ls e r v e r 等等。 1 2o - rm a p p i n g 的主要作用 在数据库应用程序的设计中,如何尽量减少应用程序和数据库结构之间的耦 合性一直是程序员追求的目标。从c s ( 客户服务器) 结构到中间应用服务器,再 到b s ( 浏览器朋鼹务器) 结构,人们提出种种不同的数据库应用程序的开发体系的 一个主要目的就是为了使我们开发的应用程序尽可能的不受数据库结构变动的影 响。 我们现在开发的数据库应用程序大多数使用的都是面向对象的语言,例如 v b c h ,j a v a ,d e l p h i ,p o 旺r b u i l d e r 等等,而当今应用最广泛的数据库基本上都是 关系数据库,如s o ls e r v e r ,d b 2 ,s y b a s e ,o r a c l e 等等,而对数据库的操作都是使 用s o l 语句,虽然也有对象数据库或对象一关系数据库,但应用很少,同时技术不 成熟。而我们知道对象是由数据和行为组成,关系数据库则是由表和它们之间的 关系组成的,因此使用面向对象的语言开发出来的对象不可能以一种很自然的方 式将其存储在关系数据库中。虽然这种技术上的差异不可能完全消除,但我们可 以遵循适当的方法使之最小化。也就是说我们可以在面向对象的应用程序和关系 数据库之间设计一个中间层,由该中间层负责对象和s o l 语句之间的转换,让面向 对象的开发人员专注于理解业务逻辑,设计对象。使用这样一个中间层后就可以 对应用程序屏蔽具体的数据库访问操作,使我们开发的应用程序尽可能的不受数 电子科技大学硕士学位论文 据库结构变动的影响,从而大大地降低应用程序和数据库之间的耦合性,增强应 用程序的可移植性。这个中间层就是我们要设计的o - r m a p p 玳g 工具。 1 3o - rm p p i n g 的实现方式 如何将我们使用面向对象的语言编写的对象持久化到关系数据库中一般有三 种方式: ( 1 ) 在业务类中硬编码s q l 语句,如图1 1 所示: 业务类 图i i 在业务类中硬编码s q l 语句 这种方法是我们最常用的一种持久化对象的方法,在这个方法中,s q l 代码到 处出现在我们的类代码中,它最大的优点是代码编写的效率高;但这种方式使得 我们的业务类与数据库的结构紧密相关,数据库的一个小小的变动( 如改变一个 字段的名称或将数据库从s y b a s e 移植至1 0 r a c l e ) ,我们就必须修改业务类。 ( 2 ) 在存储过程或单独的数据类中硬编码s q l 语句,如图1 2 所示: 业务类数据类 图1 2 在存储过程或单独的数据类中硬编码s q l 语句 这种持久化对象的方法比第一种方法有所进步,但对数据库结构的变动仍然 需要修改数据类,这种方法的好处是将与数据库相互交互的部分封装在数据类中 2 目目目目 目目目目 目目目目 第一章引言 了,使得代码受到数据库变动的影响有所降低。 前面这两种持久化方法,对于用户来说都会受到数据库结构变化的影响,对 数据库的变化都需要用户自己去变动自己的代码,使得业务逻辑和数据库管理结 合得过于紧密,不利于用户专注于业务逻辑的设计。 ( 3 ) 实现了o _ rm a p p i n g 的持久化层,如图1 3 所示: 业务类 图1 3 实现了o _ rm a p p i n g 的持久化层 在这种方法中,用户只需要专心写好业务逻辑类而不需要了解数据库的结构。 用户直接操纵对象,至于对象和关系数据库中的转换将由持久化层自动来实现, 如图1 4 所示: 应用程序 it 象 li 对象 上 i 持久化层 jt 、语句ii s q l 关系数据库 图1 4 持久化层的示意图 采用图示这种持久化层的方式后,用户直接使用对象向持久化层提出访问关 系数据库的请求,持久化层负责将该对象解释成为关系数据库可识别的s q l 语句, 提交数据库接口层访问关系数据库,并将从数据库接口层中获得的结果集组织成 为对象返回给应用程序。这种方式虽然大大地减少了业务逻辑与数据库结构之间 电子科技大学硕士学位论文 的关联,但持久化层会对应用程序的性能产生一定的影响。 1 4 我们的工作 目前绝大多数的o _ rm a p p i n g 工具都是使用j a v a 语言来开发的,但当今使用 最广泛的开发语言却是c c + + 语言,然而使用c + + 语言来实现的。一rm a p p i n g 工具 应该说还没有见到有比较成功的,因此使用c + + 语言开发一个o - rm a p p i n g 工具 就具有很重大的实用价值。我们这里的工作就是要研制一个用c + + 语言来实现的 0 - rm a p p i n g 工具。 我们以下面章节来安排论文。在本论文的第二章,我们介绍o - rm a p p i n g 的 相关知识。在第三章,我们将给出用c + + 语言实现的0 一rm a p p i n g 的一个设计模型。 在第四章,我们介绍如何使用c + + 语言来实现这个o - - r m a p p i n g 模型。在第五章, 我们将给出对这个o r m a p p i n g 模型的测试和分析结果。最后,在第六章,对我 们的工作做一个总结。 们的工作做一个总结。 第二章o - rm a p p i n g 的相关知识 第二章0 - rm a p p i n g 的相关知识 o - rm a p p i n g 技术是在面向对象技术和关系数据库技术的基础上发展起来 的,最初来源于j 2 e e 的相关标准,而这些标准目前还在不断的发展中,本章对 0 rm a p p i n g 涉及的这些相关知识作一个简单的介绍。 2 1j 2 e e 中0 - rm a p p i n g 的两种标准 在j 2 e e 中,实现o rm a p p i n g 工具主要有两种标准:j d 0 ( j a v ad a t a o b j e c t s ,j a v a 数据对象) 和c m p ( 容器管理的持久性) 。j d 0 的核心思想是在企业 应用软件架构的不同层面中存储传统的j a v a 对象,而c m p 方案则基于容器环境, 并针对特殊的需求。两者的比较如下: 2 1 1 o m p 是以应用服务器为中心的 c m p 是e j b 的一种类型,它依赖于j 2 e e 应用服务器的功能。以应用服务器为 中心的应用依赖于j 2 e e 的基础设施服务。c m p 是众多j 2 e e 服务中的一种。e j b 应 用的其它特征包括跨越应用服务器群集的负载均衡,事务语义的声明式的控制, 部署时期安全访问控制,多种协议的远程访问,以及消息支持。如果应用服务器 的基本特性对你非常重要,那么你应该选择使用c m p 和e j b 。e j b 开发是昂贵的, 但是如果业务需求需要应用服务器的这些特性支持,j 2 e e 提供的这些服务就可以 平衡e j b 开发所需要的额外的开销。c m p 对象持久支持本身并不足以让你为你的企 业应用选择使用e j b 和应用服务器。 2 1 2 j d 0 是以对象为中心的 j d o 是以对象为中心的。以对象为中心的应用是指那些域对象模型需要高级的 对象模型概念,数据存储访问主要是可导航的,计算逻辑由对象的j a v a 方法的行 为所表达,而不是r d b m s 的s q l 语句。j d 0 具有复杂的对象管理和事务状态管理。 以对象为中心的应用易于开发,并且在模式或者数据存储技术变化时具有高度的 可移植性。如果你的应用必须和多种类型的数据存储一起工作,你应该考虑j d 0 。 目前j d 0 2 0 标准已经出台,基于j d 0 标准而实现了的0 - rm a p p i n g 产品现 电子科技大学硕士学位论文 在已经有好一些,比较知名的有;( 1 ) l i d o ( 法国l i b e l i s 公司) :( 2 ) k o d o j d o ( 美 国s o l a r m e t r i c s 公司) ;( 3 ) j i ) o g e n i e ( 南非h e m s p h e r e 公司) ;( 4 ) j r e l a y ( 德 国o b j e c t i n d u s t r i e s 公司) ;( 5 ) f r o n t i e r s u i t ef o r3 1 ) 0 ( 美国o b j e c t f r o n t i e r 公司) ;( 6 ) h i b e r n a t e ( 美国a p a c h e 公司) 。因此从j 2 e e 的发展来看,j d o 将会 占据主导地位。 2 2o - rm a p p i n g 需要实现的目标 一个设计良好的o r m a p p i n g 工具应当封装使对象持久化的行为,即从( 或 者向) 存储介质中读取,写入,删除对象。为了支持这些功能,o r m a p p i n g 工 具一般来说需要实现以下目标: ( 1 ) 多种持久机制。一个持久机制是一种可以永久保存对象使其可以在以后 被更新、获取和删除的技术。可能的持久机制包括文本文件、关系数据库、对象 关系数据库、层次数据库、网络数据库和对象数据库。目前主要的持久机制是关 系数据库 ( 2 ) 对持久机制进行完整的封装。理想情况下,只需要发送s a v e 、d e l e t e 、r e t r i e v e 消息给一个对象,就可以保存、删除或者获取它,持久层完成其它的工作。进一 步讲,除了对已知异常的处理,不必写任何其它关于持久层的代码。 ( 3 ) 基于条件的多对象操作。因为一次返回多个对象是很常见的,例如一个 报表或者一次用户定制的搜索,持久化层应该支持根据一定条件同时返回多个对 象的情况。对于根据一定条件删除多个对象也同样应该支持。 ( 4 ) 基于关联的多对象操作。就象在关系数据库中可以进行关联的删除、获 取和保存一样,这些操作也应该可以针对对象。一个最好的例子就是一个顾客对 象拥有多个订单对象实例,在获取、删除或者保存一个顾客对象的时候,应该自 动的获取、删除或者保存它的订单对象。 ( 5 ) 事务。与功能3 相关的是支持事务,也就是针对多个对象的一组操作。 一个事务应该由保存、获取或删除的任意组合组成。事务可以是简单的,一种“要 么全部要么没有”的方式,操作必须全部成功或者全部回滚( 取消) 。或者也可以 是嵌套的,在外层的事务失败的时候,嵌套的事务仍然提交而不回滚。事务可以 是短期的,只运行千分之一秒,或者是长期的,花费几小时、几天、几周甚至几 个月。 ( 6 ) 扩展性。你可以增加新的类或者属性,并且能容易的变更持久机制。( 例 6 第二章o - rm a p p i n g 的相关知识 如从s y b a s e 数据库一直到o r a c l e 数据库) ( 7 ) 对象标识符。对象标识符( o t o ) ,是一个属性,通常是一个编号,用来唯 一标识一个对象。o i d 是关系理论中在一个表中唯一标识一行的列一键( k e y ) ” 的等价物。 ( 8 ) 组合键。传统的数据库结构经常使用由两列或多列构成的组合键来唯一 标识一行。尽管这样使数据库结构和持久化层都变得复杂,但为了保持向下兼容, 持久化层通常也提供该功能。 ( 9 ) 多键。传统的数据库结构中,一个表中经常包括多个键( 表可以有一个 主键和多个次键) 。持久化层应该利用这些额外的键带来的性能方面的好处。 ( 1 0 ) 游标。一个支持从一个命令获取多个对象的持久化层,也应该支持获取 游标。这是一个效率问题:你是否希望用户一次只从持久机制的几百万个p e r s o n 对 象中获得一个呢? 当然不。游标就是关系世界中这样的一个有趣概念。一个游标 是一个到持久机制的逻辑连接,从这个连接,可以可控的获取对象,通常一次多 个。这样常常比一次返回上百个甚至上千个对象要有效率,因为用户可能并不立 即需要所有的这些对象( 可能通过一个列表翻滚) 。 ( 1 1 ) 评估结果集大小。在执行一个多对象操作的时候,你希望先确定有多少 持久对象会被这个操作影响。例如,一个用户可能输入一个蹩脚的可能导致几千 条结果的查询条件。你应该希望在执行操作前告诉他以使用户决定是否重新定义 条件。 ( 1 2 ) 代理。对游标的一个补充就是“代理”。代理代表另外一个对象,但是又 不会导致与被代表的对象同样的开销。代理只包括足以让计算机和用户标识它的 信息,而没有其它的内容。例如,一个p e r s o n 对象的代理包含它的o i d ,因此应 用程序可以标识它,也包含姓、名以便用户可以分辨出这个代理代表的是谁。代 理通常用在用户在一个显示出来的结果集列表中选择一条或者两条的时候使用。 当用户从列表中选择了代理对象的时候,真正的,比代理对象大的对象被自动的 从持久机制中获取出来。例如,完整的p e r s o n 对象可能包括地址和个人照片。通 过使用代理,你不必在网络上传递每个p e r s o n 对象的所有信息,而只传递那些将 被实际用到的。这也被称为l a z yr e a d 。 ( 1 3 ) 记录。目前市面上大量的报表工具都是以数据库记录作为输入,而不是 对象。如果你正在一个面向对象的应用程序中使用这样的工具进行报表处理,你 的持久化层应该支持在r e t r i e v e 请求后返回记录的能力。这样可以避免数据库记录 转换成对象后再转换回记录产生的开销。 电子科技大学硕士学位论文 ( 1 4 ) 多种体系结构。当计算从集中的主机迁移到两层的客户机服务器结构再 到多层结构再到分布式对象的时候,持久化层应该可以支持这些变化。要点是你 必须假设在某些时候持久化层可能存在于一个可能非常复杂的环境中。 ( 1 5 ) 不同数据库版本和厂商。你会升级你的数据库或者移植到其它的数据库。 持久化层应该支持在不对应用程序造成影响的前提,简单的变更持久机制。因此, 持久化层应该支持多种数据库版本和厂商。 ( 1 6 ) 多连接。多数组织使用多种来自不同厂商的数据库,而这些数据库又会 被同一个对象应用程序访问。这等于说要求持久化层应该可以对每种持久机制都 提供多个、同时的连接。即使一些像从某个持久机制拷贝一个对象到另外一个这 样简单的事情,比如从一个中心数据库拷贝到本地数据库,都至少同时需要两个 连接,每个数据库一个。 ( 1 7 ) 连接池。持久化层应该可以共享数据库的连接,尤其是如果将被部署为 应用服务器的一部分的时候。在这种情况下,几百个甚至几千个客户会连接到一 个应用服务器。因为每个连接都需要内存并且并非每个客户都需要连续访问一个 固定的持久机制,所以在持久化层维护一个连接池,并且在所有客户当中共享连 接是有必要的。 ( 1 8 ) 专用和非专用驱动。数据库通常提供多种访问方式,一个好的持久化层 应该支持这些常用的方式。连接方式包括使用o d b c 、j d b c 和由数据库厂商或者 第三方提供的专用驱动等。 ( 1 9 ) 语言绑定。你的软件需要能够访问你的持久层,因此持久化层需要能够 支持你所选择的开发语言。 ( 2 0 ) 映射的灵活性。因为映射类层次结构有三种主要的方式:属性类型映射 为字段类型,属性映射为字段,类映射为表,所以持久化层应该可以支持你所选 择的不同映射方式。 ( 2 1 ) 生成数据库结构。如果你的c a s e 工具不支持从对象结构产生数据库结 构并且也不支持从数据库结构产生对象结构,持久化层就应该可以做到。 ( 2 2 ) 关系遍历。持久化层应该支持在对象之间遍历关系,也包括自动的更新 创建删除关系( 包括聚集关系) 。 ( 2 3 ) s q l 查询。在面向对象的代码中写s q l 查询是对封装原则的公然违背, 这样会直接耦合应用程序与数据库结构。然而,为了性能的原因,有时候需要这 样做。在代码中的硬编码s q l 应该是异常情况,而不是正常情况,并且在发生这 样的异常前,应该仔细权衡。不管怎样,持久化层还是需要支持这种情况。 第二章o - rm a p p i n g 的相关知识 ( 2 4 ) 调用存储过程。尽管在持久化层中应该何避免使用难于移植的存储过程 的方法,但是在现实中偶尔还是要用到它。因此,持久化层必须支持调用存储过 程。 ( 2 5 ) 缓冲区。一个提高性能的方法就是缓冲对象。持久化层应该实现个对 象缓冲区或者能够访问一个外部的缓冲区。 ( 2 6 ) 锬。应该可以在访问数据的时候指定使用悲观的锁或者乐观的锁。 ( 2 7 ) 支持管理工具。多数持久化层,是运行在元数据上的。元数据需要被维 护,理想状态下,用一个管理应用程序维护。 ( 2 8 ) 运行时刻配置。应该可以在运行时刻修改持久化方法的某些特性,例如 游标大小,持久机制的名字,位置等。 从以上o rm a p p i n g 工具的要实现的目标可以看出,o rm a p p i n g 工具 应该让应用程序开发者集中精力于他们所擅长的开发应用程序,而不用关心他 们的对象是如何存储的。进一步说,持久化层也应该允许数据库管理员( d b a ) 做他们最擅长的一管理数据库,d b a 应该可以移动表,重命名表,重命名列以及 重新组织表而不影响应用程序对他们的访问。当然,要完全实现上面讲到的所有 目标,是一件很困难的事情,我们可以根据实际的需要进行功能上的裁减。 2 3 反射和内省 使用面向对象的语言设计一个o - rm a p p i n g 工具,该语言必须具各“反射” 和“内省”的能力。“反射”是一种可以在运行时刻动态的操纵对象的能力,即在运 行时刻增加,删除,修改对象的内在属性和接口方法;“内省”是一种运行时刻发 现对象接口的能力,即在运行时刻动态地查找对象的接口方法并进行调用。“反射” 和“内省”对于s m a l l t a l k ,j a v a ,n e t 这些语言来说是内建的,比如在j a v a 中有一 个类j a v a 1 a n g r e f l e c t ,在该类中就封装了j a v a 进行“反射”和“内省”的相关接 口。但对于c + + 语言来说“反射”和“内省”不是c + 十标准的一部分,因此c + + 语言不 具备这两种能力,所以如果打算使用c 抖语言来设计一个o - rm a p p i n g 工具就 需要自己来实现这两个特性。一般来说有四种实现方式: ( 1 ) 分析d e b u g 信息。我们知道c + + 语言在进行编译和链接时可以通过一个 链接选项一d 来保存c + + 对象运行时的一些信息,比如r t t i 的相关信息, 使用这种方式就是对这些信息进行分析,获取对象的相关信息,这种方式 使得我们可以不修改应用程序就可能获得对象的全部信息。它的缺点是过 9 电子科技大学硕士学位论文 于依赖d e b u g 信息,用户必须将这个链接选项打开,而用户通常会在程 序的正式发布版本中取消这个选项以增加程序运行的效率和节省存储空 间:另外存储这些d e b u g 信息的格式有很多种。这是因为标准的可执行 文件格式就有很多种( 例如c o f f ,e l f 等等) ,这样就使得我们必须针对各 种格式都要写一个分析程序。 ( 2 ) 建立一个专门的预编译工具来分析c + + 的对象信息并建立起对应的描述信 息。这种方式使得我们可以不修改应用程序就可以获得“反射”和“内省”的能 力。它的缺点是必须依赖于特定的编译器,因为不同编译器在虚拟函数表 的设计格式,命名习惯等等这些方面都是不同的。 ( 3 ) 设计一个支持反射的编译器。这种方式显然对应用开发人员来说是最为便 利的,并且可以为反射生成效率很高的代码。它的缺点也是非常显著的, 那就是设计一个编译器是非常困难的。 ( 4 ) 让应用程序员自己提供一个c + + 的反射工具。这种方式对于开发o - r m a p p q g 工具的程序员来说是最方便的,但一般情况下“反射”和“内省”对 于应用程序员来说应该是透明的,它应该是开发语言自身的一部分或者是 集成在o rm a p p 阱g 工具中,所以这种方式一般是不可取的。 2 4 小结 在本章中我们主要介绍了以下内容;n e e 中o - r m a p p 矾g 的两种标准一 d o 和c m p ;一个o rm a p p r q g 模型需要实现的目标以及反射和内省三方面 相关的知识。由于o - rm a p p r q g 是在j a v a 中提出来的,我们使用c + + 开发 一个持久化层时也是参照j d o 标准来设计,同时对一个o rm a p p n g 模型实 现的完整目标进行了相应的裁剪;同时使用一个第三方软件来弥补c + + 不支持 反射和内省的缺陷。 第三章用c _ h 语言实现的o rm a p p i n g 模型 第三章用c + + 语言实现的o - rm a p p i n g 模型 3 1 设计背景 在中兴通讯股份有限公司本部事业部的传输网管产品中,使用s y b a s e 数据 库来管理各种传输设备的信息;这些设备信息的结构基本类似,但由于在光传输 控制中,实时性的要求很高,因此为了提高数据库操作的速度,为每一种设备在 s y b a s e 数据库中都建立了一张对应的数据表。而对数据库进行操作的应用程序 是使用c + + 语言来开发的,这样一来在应用程序中,对各种设备的业务处理方式就 基本相同,但却需要针对相似的数据表写不同的业务逻辑类,这就使得代码比较 冗余,维护比较困难,在增加新设备时,也必须进行一些重复性的工作,扩展性 受到很大制约。为了克服这种缺点,我们提出了使用o rm a p p i n g 的方式来解决 这个问题,降低应用程序和关系数据库之间的耦合性。但是由于目前成熟的0 一r m a p p i n g 工具基本上都是使用j a v a 语言开发的,所以我们决定使用c + + 语言来开 发一个0 一rm a p p i n g 工具。 3 20 - rm a p pin g 模型的总体设计思路 0 一rm a p p i n g 工具其实就是我们在“引言图1 i4 ”中看到的持久化层,对 于这个持久化层我们将其设计为七个子系统,其功能如表3 1 所示 表3 1o - rm a p p i n g 模型的系统划分 模块名描述 x m l 文件装载将用户己配置好的用于存储类和数据库之间映射关系的x m l 文件 和解析子系统载入内存,并解析x m l 文件中的数据。 m a p 映射子系一组子模块,封装了从类映射到数据库的行为;包括类和表,属 统性和字段的映射行为。 反射子系统根据“x m l 文件装载和解析子系统”提供的有关要注册的类信息, 创造相应的类实例,提供操作类实例的相关方法;同时提供数据 类型的转换功能。 s q l 语句构造 根据“m a p 映射子系统”和“反射子系统”中的类信息和数据库 电子科技大学硕士学位论文 子系统信息,构造操纵数据库的相关s q l 语句,包括 s e l e c t ,u p d a t e ,i n s e r t ,d e l e t e 等等。 用户接口子系向用户提供持久化对象的一系列方法,包括增加对象,删除对象, 统修改对象,查询对象。 数据库操作接封装了操作数据库的一系列方法,包括联接数据库,断开数据库 口子系统联接,开始事务,提交事务,回滚事务,执行s 让语句等。 多数据库类型考虑在不同数据库之间s q l 语句的差异性,实现在不同数据库平 设计子系统台之间的兼容性。 对于这七个子系统之间的相互关系,我们可以用图3 1 进行示意: 图3 1o _ rm a p p i n g 模型各子系统之间的相互关系 3 3 对象一数据库映射关系的存储 对象和关系数据库之间的映射类型有三种方式:属性类型映射为字段类型, 属性映射为字段,类映射为表,当我们以对象向数据库提交操作申请时持久化层 必须要知道这些映射关系,以便将操作转换相应的s q l 语句,或者将数据库返回 的数据集转换为相应的对象集。所以,我们必须将这些信息存储到持久介质中以 便于持久化层获取。 目前x l v i l 文件已经被大量的用于不同应用程序之间进行数据交换,对x m l 文件的读写操作也已经标准化了,有大量的已实现的成熟库可以利用。因此我们 使用x m l 文件来存储对象和数据库之间的映射信息。我们为每一个要持久化的类 配置一个x m l 文件。在该x m l 文件中存储了这个类和它的属性与数据库中的表 和字段之间的映射关系,我们以图3 2 作为示意,其存储的格式如下所示: 1 2 第三章用c + + 语言实现的o rm a p p i n g 模型 d a t a b a s ev a l u e = 黼库乎台名弦| ) d a t a b 融e n a m e 吲u a = l u l 摩名g 。a - 一 o p t i o np a r a m e t a r y a l u e 娉i r d l rv a e :囔鼍衰l l i c p t 油p a n i m t e r v a 忙垮蠹售2 诵噼黼寰妒, 口p l 断p a a 哪埘帆m e = 哮轴3 v a k m = l r l 表3 序 一 m e m b e r m e m b e r n a m e = 矗量1 名帮m e m b 盯t 1 j i i e = i 【i 竞最醇噬。f i a l d n a m a = 。最最1 在寰中i p 臣名嚣自e t y p e = 戚最l 在表中的宇鲅 o w n 8 1 t l a m e j 囔鲁1 i 肛 o w n e rn a m a = 餮i 2 a o w n o rn a m a = i 4 i - 3 。a 一 :m e = m b e rm e m b e 删a f 怕;蠢量2 名拜m 鲫b e r t y p e :。煮量2 曩壁6 e 旧h a m e = _ 威曼2 i 攮中的字臣名嚣。f i e d t y p e = 噱曼2 在衰中的字髅 o w i _ i a r n a m e = 嘬鲁l 。a o w n e rn 拍e = _ i 餮鲁2 1a o w n e rn a m e = 囔+ i 3 。厶 m e m b e rm e m b a n , j a m e = i i 蠢a 3 错m a m b e r t y p e = 懒磺墅e b h 湎b :j 蠢j l 嫩帕字臣名群刚忡:l 纛量3 在表帕字鲅 o w n e r i a m e = 嘬备1 扫 o w n e rn a m e = 锵3 序 图3 2 瑚l 文件的存储格式 3 4 各个子系统的模块组成 3 4 1x m l 文件装载和解析子系统 对于这个子系统我们可以将其分为x m l 文件装载和) 【m l 文件解析两个子模块, 其功能描述如表3 2 所示: 表3 2x m l 文件装载和解析子系统的模块划分 子模块名描述 x m l 文件装载( x f l l o a d e r )读入用户指定的x m l 文件,构造m a p 映射子系统”。 x m l 文件解析( x m l p a r s e )提供从删l 文件读取数据和向x m l 文件写入数据 的相关接口函数。 这两个子模块之间以及他们和其他子系统之间的关系如图3 3 所示 电子科技大学硕士学位论文 图3 3d i l 文件装载和解析子系统子模块之间的相互关系 3 4 2m a p 映射子系统 对于这个子系统我们可以将其分为属性映射模块,字段映射模块,表映射模 块和数据库映射模块,这五个子模块的功能描述如表3 3 所示: 表3 3m a p 映射子系统的模块划分 子模块名描述 类映射模块( c l a s s m a p )封装了映射一个类的实例到数据库的行为;维护一组 属性映射模块。 属性映射模块映射一个属性到数据库中数据表的一列;维护相对应 ( a t t r i b u t e m a p )的一个字段映射模块。 字段映射模块存放字段的名称和类型,维护相对应的一个表映射模 ( c o l u m n m a p )块。 表映射模块( t a b l e m a p )存放表的名称,维护相对应的一个数据库映射模块。 数据库映射模块存放数据库的名称。 ( d a t a b a s e m a p ) 这五个子模块之间以及他们和其他子系统之间的关系如图3 4 所示: | | ) 删l 文件装载和解l| | 1 粪映射 维护 ;i | 属性映i 维护字段映i i _析子累统卜韵嘴亡爿i 模块卜_ 剖射模块卜剖射模块i i罐护 s q l 语句构造i | ;数据库映 维护| ;表映射 |; 子系统l 射模块i 十模目曩1 ;_ 1 e 三三訇e 刍匡受劐 图3 4m a p 映射子系统子模块之间的相互关系 第三章用c + + 语言实现的o rm a p p i n g 模型 3 4 3 反射子系统 对于这个子系统我们可以将其分为反射子模块和数据类型转换子模块,这两 个子模块的功能描述如表3 4 所示: 表3 4 反射子系统的模块划分 予模块名描述 反射子模块( r e f l e c t i o n )实现对象的“反射”和“内省”功能。 数据类型转换子模块实现c + + 中s t r i n g 类型向数据库字段类型,数据 ( t y p e c o n v e r t e r )库字段类型向“反射子模块”定义的数据类型之 间的转换。 这两个子模块之间以及他们和其他子系统之间的关系如图3 5 所示: 图3 5 反射子系统子模块之间的相互关系 3 4 4 s q l 语句构造子系统 对于这个子系统我们可以将其分为s e l e c t 语句构造模块,i n s e r t 语句构造模 块,u p d a t e 语句构造模块,d e l e t e 语句构造模块,w h e r e 语句构造模块,o r d e r b y 语句构造模块,g r o u p b y 语句构造模块,h a v i n g 语句构造模块,条件参数构造模 块,这九个子模块的功能描述如表3 5 所示: 表3 5s q l 语句构造子系统的模块划分 子模块名描述 s e l e c t 语句构造模块构造s e l e c t 语句中除w h e r e ,o r d e r b y ,g r o u p b y , ( s e l e c t s t a t e m e n t )h a v i n g 子旬以外的部分。 i n s e r t 语句构造模块构造i n s e r t 语句。 ( i n s e r t s t a t e m e n t ) 雾 萋| 习刍 竺 雾一一 竺 丽叠一一 于一 颈= 一_ 国 零型一 电子科技大学硕士学位论文 u p d a t e 语句构造模块构造u p d a t e 语句中除w h e r e 子句以外的部分。 ( u p d a t e s t a t e m e n t ) d e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论