基于XML-关系映射数据访问层的设计与实现
2015-12-04张艳明
张艳明,檀 明,邹 乐
(合肥学院 网络与智能信息处理重点实验室,合肥 230601)
一、引言
数据是一个应用系统的核心,应用系统所有功能的运行都依赖于数据的支持。企业级JavaEE应用系统大多使用数据库技术来存储应用系统的数据,数据访问层则是应用系统中运行数据和数据库中存储数据之间的交互,主要包括数据的查询、添加、修改和删除等操作。
本文在分析JavaEE应用系统现有数据访问层解决方案的基础上,提出一种轻量级、可重用的数据访问层组件实现方案,并应用于合肥学院高校实验室管理平台项目。该方案可用于构建企业级应用系统中的数据访问层,具有实际意义和价值。
二、数据访问层
(一)JavaEE数据访问层
根据软件分层设计思想的指导,JavaEE应用通常被划分为四个层次:表示层、业务逻辑层、数据访问层和数据库层。其中,数据访问层[1]是在对象/关系数据库之间提供一个成功的企业级别的映射解决方案。它代表系统中一个相对独立、界限明确的逻辑层次,创建一个集成数据库存取逻辑的门户,屏蔽对底层数据库访问的依赖性以及不同数据库之间的差异性[2],向开发人员提供透明的数据持久化机制。数据访问层由业务逻辑层通过接口调用,使系统以更松散的形式耦合,较好地达到易于维护和扩展的目标[3]。
(二)常见数据访问层
目前数据访问层的实现有多种解决方案,如JDBC、EJB、ORM 等[4]。JDBC是最原始的数据访问方法,在程序中直接编写SQL语句进行数据库存取,存在开发效率低下的问题。EJB实体Bean采用CMP管理策略,封装数据访问细节,开发人员不必编写SQL语句,但EJB实体Bean必须运行在EJB容器之中,运行环境受限,开发难度也较大。ORM(Object-Relation Mapping,对象关系映射)是目前广泛采用的一种数据访问层实现方案,Hibernate作为其中的代表者,对JDBC做了轻量级的封装,提高了程序员开发效率,但Hibernate的设计过于灵活,运用不慎反而会导致程序运行效率低下。
三、基于XML-关系映射数据访问层的总体设计
(一)数据访问层设计思路
XML具有自描述的特征,XML数据已经成为互联网上流行的数据表示格式以及应用系统中数据交换的开放标准[5-6]。基于XML-关系映射数据访问层利用Java与XML技术相结合的优势,采用XML作为数据访问层的数据交互格式,提供一种XML格式数据与关系数据之间的映射转换方法,实现高效的数据库操作。
(二)数据访问层总体架构
基于XML-关系映射数据访问层主要包括数据库模型组件、数据访问控制组件和SQL动态构建组件。数据库模型组件负责针对关系数据库中的表、视图等数据结构进行建模,构建一组数据库模型类用以描述表名称、字段属性以及表之间关联关系等。数据库访问控制组件和SQL动态构建组件负责在系统运行阶段,根据数据库模型组件封装的元数据信息,结合输入的XML格式数据,动态构造出数据库存取访问的SQL语句,自动完成数据库增删改查操作。该数据访问层支持XML到数据库以及数据库查询结果到XML之间的双向映射转换,位于数据库层和业务层之间,总体架构如图1所示。
四、数据访问层的实现
(一)数据库模型组件
通过PowerDesigner工具提供的API接口,对设计阶段生成的数据库物理模型进行编程,生成用以描述数据库结构信息的一个XML文件。启动运行时,由系统引擎对该XML文件进行解析,构建数据库模型组件。
以合肥学院高校实验室管理平台中的实验室表和实验室人员表(主从关系)为例,其数据库物理模型(部分)如下所示:
其生成的数据库描述XML文件部分内容如下:
以上XML内容描述了数据库“实验室表”sys_sys和“实验室人员表”sys_sysry的基本结构,包括字段信息和表关联信息等。其中,“实验室表”中的字段“所属实验室”fk_sys_sssys_i为外键字段,参照“实验室表”sys_sys的主键,cascade=“0”表示针对主表sys_sys进行更新操作时不级联更新从表sys_sysry。XML文件中的其他描述信息,primary代表是否为主键,foreignkey代表是否为外键,mandatory代表是否允许为空,datatype代表数据类型。
针对数据库描述XML文件,系统运行时自动解析生成的数据库模型组件包括DataBaseTable、Data-BaseColumn等。DataBaseTable类封装一张表的基本信息,DataBaseColunmn类封装一个表字段的基本信息。
(二)数据访问控制组件
数据访问控制组件负责XML格式数据与关系数据之间的映射转换,支持在一个XML文档中包含多个表的数据。表之间可以是主从关系,主从关系可以嵌套。针对增删改等更新操作,将业务层传递过来的XML格式数据持久化进关系数据库,针对查询操作,对数据库查询返回的结果集转换为XML格式数据。
数据访问控制组件的主要方法如表1。
表1 数据访问控制组件主要方法描述
以添加实验室及实验室所属人员的操作为例,下面是描述信息添加的XML部分数据内容。
definition属性action定义具体操作,“0”代表插入操作。以上XML内容表示向数据库“实验室表”sys_sys添加一条实验室基本信息,同时向“实验室人员表”sys_sysry添加两条实验室所属人员信息。文档元素名与数据表名一致,元素属性名与表字段名称一致。
数据访问控制组件的xmlDataToDB方法采用DOM4J技术,遍历XML文档树节点数据,利用递归算法完成对主从表的数据添加。部分代码片段如下:
其中,executeInsertSQL方法负责动态生成具体的插入SQL语句,完成对数据库的实际更新。该方法由SQL动态构建组件提供。
(三)SQL动态构建组件
数据访问控制组件的运行依赖于SQL动态构建组件。SQL动态构建组件调用底层JDBC函数,完成具体的数据库操作,主要包括executeInsertSQL、executeUpdateSQL、executeDeleteSQL、execute-QuerySQL等方法。该组件的实现重点是能够支持大部分可用JDBC访问的数据库,支持字符串形式的XML元素属性值与关系数据库表不同类型字段之间的映射,支持大尺寸数据字段,支持事务控制。
以执行添加SQL语句的executeInsertSQL方法为例,动态SQL语句生成组件利用一个List保存XML文档树当前元素的所有属性对象,代表要插入数据表的一组字段对象,利用另一个List保存各字段在数据表中的实际类型值。表字段的实际类型可通过数据库模型组件获得,数据库模型组件封装了数据库描述XML文件的所有相关信息,包括具体字段类型。之后,组件从两个List中逐一取出数据,根据具体字段类型,调用JDBC底层函数完成相应赋值。在这一过程中,SQL动态构建组件会调用数据库方言工厂类方法获取具体数据库方言,针对不同数据库构造特定的SQL实现。
五、结束语
本文在分析JavaEE应用系统现有数据访问层技术的基础上,提出一种基于XML-关系数据映射和转换的数据访问层组件实现方案,实现数据访问和业务逻辑相分离,使系统层次清晰,具有较好的灵活性和可扩展性。在此基础上,通过合肥学院高校实验室管理平台项目阐述了关键技术和实现方法。该系统在实际运行中性能稳定,效果良好。
[1] 〔美〕理查德·森.POJOS in action(中文版):用轻量级框架开发企业应用[M].李琳骁,王海龙,译.北京:电子工业出版社,2007:95-148.
[2] 王合闯,卢涵宇.数据访问模型和数据访问层构造器的设计与实现[J].微电子学与计算机,2011,28(5):1-3.
[3] 尧怡陇,叶松.基于接口多层架构的 WTTVS实时监控管理系统设计[J].计算机应用与软件,2014,31(6):29-31.
[4] 徐世友,袁兆山.Java EE数据持久层解决方案的设计与实现[J].合肥工业大学学报:自然科学版,2009,32(1):47-50.
[5] 洪欣.XML模式到关系模式的递归结构映射算法[J].兰州理工大学学报,2012,38(1):94-97.
[6] 成炳花,刘金广.在B/S网络系统中应用 XML技术的研究[J].武汉理工大学学报,2010,32(22):209-212.