段强
湘西农副产品网络平台这个项目初期是作为一个中小型的垂直行业电子商务平台而进行设计的,但是在项目的设计需求中明确提出了要考虑到日后要能方便升级为大型的网络平台,同时在系统架构的概念性设计中也特别关注了这个问题。因此后续的开发工作中,在对数据层的设计上,我们细化出了一个在数据库层之上的一个持久层来处理。
一、为何选用持久层
持久层是实现数据持久化的一个逻辑上的层次。数据持久化就是对系统中的数据固化到硬盘等物理存储器中的一个过程。最大众化的情况,就是通过某些程序设计语言把从软件界面取得的数据保存到数据库中的一个过程。
使用数据库对数据进行管理,效率最高的方法就是直接使用SQL语句。但是在主流的OOP编程语言平台中,都不可避免地会把SQL语言和编程语言混杂在一起,即使程序员经过了精心设计,也依旧如此。本项目计划使用JAVA作为开发平台,同样面临相同的情况。但是这样的做法,在提高了软件效率的同时,却牺牲了软件的可修改性,尤其是在数据库层更新为大型数据库或分布式数据库时,需要重新编写的代码将不亚于重新开发所需要的代码量。
二、如何设计持久层
在使用JAVA开发的软项目中,其业务对象大体上可以分成普通的Java对象和持久对象。普通的Java对象用于控制、逻辑处理等业务,而持久对象则用于对数据库中的数据实体进行映射。从功能上说,如果要在数据库中插入一条记录,则大致等同于将一个持久对象进行初始化,而在数据库中删除一条记录,则等同于将这个持久对象赋值为NULL,且清理内存。可以说,数据持久化之后的结果是数据库中存在真实的数据记录,而数据持久层中的数据则是存储在可掉电设备(例如内存)中的对应数据库中数据的一些映射。
在代码编写阶段,最原始的使用持久层的技术就是一些简单的代码编写工作,但是在企业级的开发中,就必须将对象-关系的映射(Object-Relation Mapping,ORM)框架与持久层的开发结合起来考虑了。
在本系统的设计中,出于对高可修改性的需求的满足来考虑,我们对数据的处理采取了以下几个步骤:1、使用DAO设计模式将底层的数据库访问和高层的业务逻辑分离,利用DAO模式提供的接口实现对数据库的查询、删除等操作;2、采用工厂方法(Factory Method)设计模式设计类和接口,并实现系统接口来实现底层对象的访问;3、充分利用面向对象程序设计中的继承的概念,设计各种持久对象的子类,以便方便地将数据库中的各种表中的记录转换为各种值对象来访问。
就目前预期的系统使用而言,以上3个步骤的设计和实现完全依靠手工编写代码是绰绰有余了。可是倘若本软件系统日后的数据库处理需求升级或功能需求进行了拓展后,我们将无法避免DAO模式中对于1对多(1:N)关系处理的弊端:对于1:N关系的持久对象的查询随着数据的拓展变成了1+N次SQL语句的执行,直接导致代码的出现大量的重复执行,最终将导致系统可修改性完全丧失。这就不得不让我们选择一个较为可行的开发框架作为我们数据持久层设计的基础,其目的在于提高系统的可修改性。最终我们选定Hibernate作为本软件系统持久层开发工具。
Hibernate的工作机制如图1所示。使用Hibernate之后,编写在业务逻辑层中的代码通过Hibernate提供的API来操作数据这对代码的编写工作来说是相当有利的。下面以用户基本信息表中的部分信息为例,概要阐述如何应用Hibernate设计一个持久化类,然后使用这个类的任意实例完成对应的任务。创建最终用户信息的持久化类时,该类的属性必须与数据库中表的字段存在1:1的映射关系,还需要设置一个类似print()方法作为输出的接口。在本例中,类的类图如图2所示。
类的设计完成后,需要在的是将数据库中的表与这个类的对象产生联系。为了实现这个目标,只需要编写一个映射文件以实现数据库中的数据和类的映射。之后继续完成Hibernate的配置文件hibernate.cfg.xml中相应的内容即可。接下来是编写Hibernate的配置文件hibernate.cfg.xml。该文件的部分内容如表5.2所示。
三、如何应用持久层的设计
在完成了以数据持久层的配置和设计工作以后,就可以专注于在建逻辑层中设计不同的类来实现各种功能了。例如,如果设计用户注册功能的类,其核心代码如表1所示。
小结:数据持久层的设计及其实现是有关系统效率、安全和可修改性等一系列质量属性优劣与否的重要工作。在软件架构的概念设计中需要考虑这个问题,在软件架构的实际设计中需要在技术选型、开发平台等技术细节中对此设计予以实现。但是这仍然是粗粒度的设计,但是已经可以为具体完成代码编写的工作人员提供开发依据了。