时间:2022-10-11 02:43:30
摘要:在大型企业应用软件系统开发中,常需面对不同类型数据源,由于异类数据源的访问机制不同,异类数据源的存在给程序开发和维护带来困难。为解决该问题,设计一基于设计模式的通用数据层访问组件模型,文中以系统重构前后如何适应多数据库为例进行说明。
关键词:重构;MVC架构;DAO模型;设计模式
中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)07-1503-04
Research and Application of General Database Access on Design Patterns
ZOU Guan-hui, LONG Jun
(School of Information Science and Engineering, Central South University, Changsha 410083, China)
Abstract: We often deal with problem of different type data sources when design a enterprising application, which brings a lot of troubles to the development and maintenance of system because of different data sources have different access mechanism. A general data layer component model was designed and implemented in patter model.
Key words: refactor; Model/View/Controller; DAO model; design pattern
1 概述
企业有一05年度开发的管理系统,当时采用JSP+JavaBean架构,因受个人能力有限,虽然实现了逻辑功能和显示功能的分离,但是由于视图层和控制层都是由JSP页面实现的,即视图层和控制层没有实现分离,仍属于传统Model1模式,不符和MVC开发原则。因该软件目前整体运行情况良好,满足企业需求,想在不改变软件行为的前提下,对软件内部结构及代码进行重构,使管理系统符合J2EE技术标准,提高代码其可阅读性,实现软件更大粒度的复用。
因重构内容较多(涉及到UI层,业务逻辑层,数据持久层、域对象层等内容),现仅以系统重构前后如何适应多数据库为例进行说明。
2 旧系统数据库连接简介
系统数据库连接方式采用数据库厂商提供的专用驱动程序,通过JDBC API调用转换为直接网络调用,实现数据库连接,个人认为这种调用方式一般性能比较好,而且也是实用中最简单的方法。
为适应多数据库访问,旧系统实现原理:应用程序(javabean、SEVLET等)―>读取配置文件->JDBC API驱动程序->访问数据库(MYSQL、SQL2000);
2.1 读取dbconfig.property配置文件,获得数据库连接信息 (Property文件内容见下)
DBType=0 //dbtype值代表数据库类型:0为MYSQL,1为ORACLE
MySQLDriver=org.gjt.mm.mysql.Driver
MySQLURL=jdbc:mysql://localhost:3306/databasename?user&password…
………
AccessDriver=sun.jdbc.odbc.JdbcOdbcDriver
AccessURL=jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}
AccessPath=D:/eclipse/workspace/news/……databasename
……………
2.2 根据读取DBType值来判断数据库连接类型
switch(DBType)
{
case 0:return(getConnToMySql ());
case 1:return(getConnToOracle());
……………
default:return null;
}
2.3 调用API函数建立数据库连接
private Connection getConnToMySql(){
StringSqlDriver = getPara("MySQLDriver ");//配置文件返回值
StringsqlURL = getPara("MySQLURL ");
Class.forName(SqlDriver);
Connection DriverManager.getConnection(sqlurl);
}
……………
private Connection getConnToAccess l(){//…..}
private Connection GetConnToSql(){//…..}
…………….
3 问题的提出
该系统中数据库访问逻辑代码没有放在视图层中,但视图层和控制层都是由JSP页面实现的,即视图层和控制层没有实现分离,属于Model1模式。随着企业规模的不断扩大,业务逻辑规则不断添加,维护难度增加,旧系统的缺陷是明显的,例如业务规则和模型代码混合在一起,这类代码依赖性使应用程序在在添加业务规则时非常麻烦;大粒度的软件复用几乎不可能。
在软件工程领域,为了降低模块耦合度,提高模块的可重用性,分层一直是广为采纳的一个方法。Model2模式――MVC开发模式克服了Model1存在的不足,MVC的具体含义是:model+view+control,即模型+视图+控制,这样的模式集成了JSP、Serclet、JavaBean,非常适合大型项目的开发,具有良好的伸缩性和扩展性。
按照MVC的设计原则,层与层之间应该保持相对独立,数据的传递在不同的层之间通常利用Java Bean来创建数据传输对象(Data Transfer Object,简称DTO),从技术的角度上面来说,有几个优点:
1) 采用DTO来传输数据可以减少传输数据的冗余,提高传输效率,更重要的是实现了各个层之间的独立,使每个层分工明确。模型层负责业务逻辑,视图层负责向用户展示模型状态。
2) 采用DTO,模型层对视图层屏蔽了业务逻辑细节,向视图层提供可以直接显示给用户的数据。在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需要修改Web层的Form Bean结构,而不需要触动业务层和持久层的代码修改。同样的,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。
结合项目中如何适应多数据库问题,决定使用DAO(DATA Access objiect)模式及工厂模式相结合的解决方案法。
4 现有系统详细说明