问题虚拟背景:
A项目组要实现一个基于Sql Server的应用,但工作环境只安装有MySql(公司对开源比较看好: )),而且客户有可能会转移到Oracle数据库环境。要求应用具有数据库移植能力和快速更换能力,使应用在工作环境调试成功后能迅速转移到客户的Sql Server环境,而且将来可以方便地转向Oracle。

Andy提出的可用方案:
1、使用标准JDBC
2、使用抽象类定义数据访问单元
3、定义具体数据源访问单元继承2中接口

代码示例:
定义数据访问单元抽象类,包含数据访问逻辑

publicabstractclassDataManager
{
protectedstaticStringconString=null;
protectedstaticStringurlString=null;
publicDataType[]getData()
{
//fetchdatausingstandardJDBCwithconStringandurlString
}


publicvoidsetData(DataType[]dataArray)
{
//storedatausingstandardJDBCwithconStringandurlString
}

}

定义具体数据源访问单元

publicclassHsqlDataManagerextendsDataManager
{
static
{
conString
="org.hsqldb.jdbcDriver";
urlString
="jdbc:hsqldb:db/YourDatabaseName";
}

}


publicclassOdbcBlogManagerextendsAbstractBlogManager
{
static
{
conString
="sun.jdbc.odbc.JdbcOdbcDriver";
urlString
="jdbc:odbc:db/YourDatabaseName";
}

}


在调用数据访问层时,可以声明一个DataManager的引用,然后在构造器中实例化为具体子类,如:

publicclassAndy
{
privateDataManagerdataManager=null;

publicAndy
{
dataManager
=newHsqlDataManager();
//或者在资源文件里填写具体子类,然后在这里动态加载并实例化
}


publicvoiddoSomething()
{
dataManager.getData();

}

}


以后要迁移到另一个数据库(有JDBC驱动),只需定义具体子类继承DataManager(如HsqlDataManager),然后修改资源文件中的DataManager名称(或者将new的类名改一下),不需要修改代码。

这兴许可以解释另一个问题:不赞成使用存储过程,而应将SQL语句嵌在代码中(适用于Java;微软注定.Net不会有平台移植性,数据库大都用Sql Server,所以写存储过程还是比较好的)。

(我在我的一个Eclipse RCP项目里使用了这种模式,从Sql server 2000到Hsql,特别方便,看起来感觉也比较好)

欢迎大家拍转,^_^



版权所有 罗明
posted on 2005-10-07 00:36 罗明 阅读(84) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: