高级数据存取框架的研究与实现
扫描二维码
随时随地手机看文章
Sun Java Center从结构上将基于J2EE的设计模式分为表示层模式、业务层模式和集成层模式。针对J2EE的不同应用,提出了分离表示层和业务层的模式和框架。而许多应用系统设计都涉及数据库或持久性数据存储,无论是采用Java数据库连接(Java Database connectivity,简称JDBC)还是某种实体组件,大多数应用系统设计都将其直接用于集成层,这样则混淆业务逻辑和数据存取,增加应用开发的复杂性,降低开发效率,增大维护工作量。
业务逻辑与具体应用有关,而与数据分布和存取方法无关。数据存取是持久性逻辑,其常规操作如创建、读取、更新和删除(Creatc,Read,Update,Delete,简称CRUD)与业务规则无关。基于上述观点和提高复用性的考虑,这里提出一种基于JDBC的高级数据存取框架,该框架旨在用于分离持久逻辑与业务逻辑,即在应用开发中提取数据存取逻辑,使其完全脱离业务逻辑,并封装在独立的框架中,再以统一接口支持业务逻辑,从而提高软件开发效率。
2 高级数据存取框架设计
采用会话外观(Session Facade,简称SF)模式实现业务逻辑与持久性逻辑的关联。会话外观模式主要用于处理集中的工作流,为表示层提供统一、粗粒度的对象访问。
实体组件可提供一种特殊的数据处理方法,但无标准Java接口,缺乏灵活性。因此会话组件利用通用的Java数据存取接口访问数据。使用实体组件存在诸多问题:复杂性导致的性能降低;BMP中的n+l查询发现者等。虽然使用JDBC容易出错,代码量大,但将操作JDBC的代码封装成高级API,大大抑制相应缺陷,并提供使用存储过程。这样就可以跨越多个数据库表的更新;RDBMS从非J2EE环境移植到J2EE环境等。
为了能应用于多种数据库,保证设计的可移植性,将业务逻辑与JDBC相应成份分离,把JDBC的使用封装到一个抽象层中,屏蔽对JDBC和具体RDBMS的依赖性。这样不仅保持了系统的灵活性,而且层次分明,易于维护。
3 高级数据存取框架模型与实现
封装数据存取接口和实现,以熟知的产品表Product和销售明细表SellDetail为例,其中,Product具有产品标识ID和产品名NAME;SellDetail具有产品ID,销售日期DATE和销售量AMOUNT的字段。这样可根据产品ID查询产品的销售清单。
3.1 根据业务需求设置数值传递对象类Value Object
对于查询操作,输入产品ID,则输出产品名、销售日期和销售数量:而对于插入操作,输入产品ID、销售日期和销售数量。数值传递对象类构造如下:
传递数据有两种方法:一是将输入数据直接设置到值对象类的相应变量中,再将该类实例作为参数,调用EJB端会话Bean中的相应方法;二是只传递输入数据的变量,在会话Bean中再将输入数据的变量值设置到值对象类中进行数据存取。通常在会话Bean中设有合法性检验功能,仅当用户身份合法且具有授权才允许查询,否则会拒绝请求。采用第二种方法效率高。不设数值传递对象类,直接使用动态数组接收并传递数据也可实现相应的功能。
3.2 SellDataDAFramework类
该类为关键类,包含具体数据存取接口实现类的对象。
在大多数问题中都使用了异常SOLException,从SOLExcep—tion中提取信息,一般用户很难理解,只有通过检查数据库供应商提供的特有代码,才能弄清异常原委。
4 DAccess类
DAccess类实现了SelIDataDAccess接口,一个接口中CRUD方法是唯一的,针对不同方法,需要重新派生一个实现类,例如DAccess01、DAccess02等。SellDataDAFramework使用DAccess类的对象起索引或指针的作用,并将其加入到vecDAccess中,通过getDAccess方法来实现,从而执行具体的CRUD操作。下面以DAccess0l为例进行说明。
5 调用高级数据存取框架
以会话Bean为例,说明如何调用高级数据存取框架。会话Bean所含的相应方法接收到参数后,先检验输入合法性和权限等业务,再调用DAccess类进行数据存取操作。
6 分析研究高级数据存取框架
为了解决数据库类型和数据存储形式的差异,Sun JavaCenter提出了数据访问对象(Data Access Obiect,简称DAO)模式,使用DAO抽象和封装所有对数据源的访问和连接,提供用户统一的访问方法,其内部实现对用户是透明的。基于DAO模式的实现框架有多种方式。
(1)JDBC方式将JDBC API操作封装成高级类,供会话组件调用,该类包括存取数据分和获取数据库连接。
(2)会话组件方式 使用会话组件控制数据存取,可使用应用服务器所提供的基础结构服务,如声明式访问控制和资源池等,但业务逻辑和持久性逻辑混在一起。
(3)实体组件方式 采用实体组件作为数据存取手段.但导致实体组件的复杂性和性能降低。
其中JDBC方式和所讨论的框架相似,最大不同在于所讨论的框架是将数据库连接部分在会话组件中实现,会话组件中统一关闭连接符。如果连续两次以上访问数据库,则无需重建连接。
基于JDBC的高级数据存取框架把业务逻辑和数据存取部分由不同类处理,彻底解决了二者间的重叠问题。经验证该框架运行良好。在会话Bean中,只需取得与具体数据库的连接以及指定在哪个DAFramework中获得合理DAccess接口实例即可。针对不同的数据库提供商,只需在会话Bean中获得各自的数据连接符,将其传给DAFramework,而不用改变框架类中的代码,测试结果证明,该数据存取框架相比传统的数据存取方法易于实现代码级复用。
异常分级处理实现是将JDBC异常转换成用户理解的普通异常,这需要根据SQLException所含的供应方错误代码及SQLState码分类处理,最后解析出具体错误。
基于JDBC的框架不包含连接数据库,框架内各个组件与具体数据库无关,即当数据库发生非结构性变化时,如服务器位置或数据库类型变更,组件保持不变,故易用应用生成器(Application Generator)自动生成框架实例,并向最终用户提供可视化交互界面。
7 结语
针对应用开发存在的问题,寻求更有效的数据存取方法,提出一种基于JDBC的高级数据存取框架,该框架旨在用于分离持久逻辑与业务逻辑,提高软件开发效率。结合工程实际表明基于JDBC的高级数据存取框架具有优越的代码复用,易于实现。