- 浏览: 2011872 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
http://www.mldn.cn/articleview/2008-6-23/article_view_3195.htm
一、前言
本文的目的是将一个获取数据库连接的普通类重构成DAO+Abstract Factory模式。
二、设计初衷
使用数据访问对象(DAO,Data Access Object)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。可以降低商业逻辑层和数据访问层的耦合度,提高应用的可维护性和可移植性。
由于底层数据源实现变化时,DAO向客户端提供的接口不会变化,所有该模式允许DAO调整到不同的存储模式,而不会影响其客户端或者业务组件。显然,DAO充当了组件和数据源之间的适配器。
三、重构
首先,创建一个获取数据库连接的普通类:
DAOClient.java
import java.sql.*;
publicclass DAOClient {
publicstaticvoid main( String[] args ) {
try {
//For Oracle
Class.forName( "oracle.jdbc.driver.OracleDriver" );
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:dy", "scott", "tiger" );
System.out.println( conn.toString() );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
再将这段代码封装到一个getConnection()方法中以便其它的地方调用:
import java.sql.*;
publicclass DAOClient {
publicstaticvoid main( String[] args ) {
Connection conn = getConnection();
System.out.println( conn.toString() );
}
/**
*得到一个Connection对象
*@returnjava.sql.Connection
*/
privatestatic Connection getConnection() {
Connection conn = null;
try {
//For Oracle
Class.forName( "oracle.jdbc.driver.OracleDriver" );
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:dy", "scott", "tiger" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
return conn;
}
}
再将此方法定义到针对Oracle的工厂类中:
OracleDAOFactory.java
import java.sql.*;
publicclass OracleDAOFactory {
private OracleDAOFactory() {}
/**
*返回一个OracleDAOFactory对象
*@returnOracleDAOFactory类型对象
*/
publicstatic OracleDAOFactory newInstance() {
returnnew OracleDAOFactory();
}
/**
*得到一个Connection对象
*@returnjava.sql.Connection
*/
public Connection getConnection() {
Connection conn = null;
try {
//For Oracle
Class.forName( "oracle.jdbc.driver.OracleDriver" );
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:dy", "scott", "tiger" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
return conn;
}
}
此时,DAOClient.java这个测试类的代码应修改为:
import java.sql.*;
public class DAOClient {
publicstaticvoid main( String[] args ) {
Connection conn = OracleDAOFactory.newInstance().getConnection();
System.out.println( conn.toString() );
}
}
考虑:通常,数据库服务器、数据库名、数据库用户、密码等应该从配置文件中获取。因此,修改Oracle的工厂类:
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
publicclass OracleDAOFactory {
privatestatic Properties prop = new Properties();
static {
try {
prop.load( OracleDAOFactory.class
.getResourceAsStream( "config.properties" ) );
} catch ( IOException e ) {
System.out.println( "File:config.properties no find,PLS check out!" );
e.printStackTrace();
}
}
private String CONNECTION_SERVER_NAME = prop
.getProperty( "oracle_server_name" );
private String CONNECTION_DRIVER = prop.getProperty( "oracle_conn_driver" );
private String CONNECTION_DBINSTANCE = prop
.getProperty( "oracle_dbInstance" );
private String CONNECTION_USER = prop.getProperty( "oracle_conn_user" );
private String CONNECTION_PWD = prop.getProperty( "oracle_conn_pwd" );
private String CONNECTION_URL = "jdbc:oracle:thin:@"
+ CONNECTION_SERVER_NAME + ":1521:" + CONNECTION_DBINSTANCE;
private OracleDAOFactory() {}
/**
*返回一个OracleDAOFactory对象
*@returnOracleDAOFactory类型对象
*/
publicstatic OracleDAOFactory newInstance() {
returnnew OracleDAOFactory();
}
/**
*得到一个Connection对象
*@returnjava.sql.Connection
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName( CONNECTION_DRIVER );
conn = DriverManager.getConnection(
CONNECTION_URL, CONNECTION_USER, CONNECTION_PWD );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
return conn;
}
}
添加配置文件config.properties:
oracle_server_name=localhost
oracle_conn_driver=oracle.jdbc.driver.OracleDriver
oracle_dbInstance=dy
oracle_conn_user=scott
oracle_conn_pwd=tiger
继续考虑,客户端在获取数据库连接时使用的是针对Oracle的数据库的工厂,但如果数据库变化了,那么客户端的代码还是要改变。因此,可以定义一个DAOFactory类,定义了一个抽象方法:getConnection()用于获取数据库连接,还有一个getDAOFactory()方法,根据参数dbType的值,返回不同的DAOFactory。
DAOFactory.java
import java.sql.Connection;
publicabstractclass DAOFactory {
publicstaticfinalintORACLE = 1;
publicstaticfinalintSQLSERVER = 2;
publicstaticfinalintMYSQL = 3;
public abstract Connection getConnection();
publicstatic DAOFactory getDAOFactory( int dbType ) {
switch( dbType ) {
caseORACLE:
return OracleDAOFactory.newInstance();
caseSQLSERVER:
return SqlDAOFactory.newInstance();
caseMYSQL:
return MySqlDAOFactory.newInstance();
default:
returnnull;
}
}
}
SqlDAOFactory.java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
publicclass SqlDAOFactory extends DAOFactory {
privatestatic Properties prop = new Properties();
static {
try {
prop.load( OracleDAOFactory.class
.getResourceAsStream( "config.properties" ) );
} catch ( IOException e ) {
System.out.println( "File:config.properties no find,PLS check out!" );
e.printStackTrace();
}
}
private String CONNECTION_SERVER_NAME = prop
.getProperty( "sqlserver_server_name" );
private String CONNECTION_DRIVER = prop.getProperty( "sqlserver_conn_driver" );
private String CONNECTION_DBINSTANCE = prop
.getProperty( "sqlserver_dbInstance" );
private String CONNECTION_USER = prop.getProperty( "sqlserver_conn_user" );
private String CONNECTION_PWD = prop.getProperty( "sqlserver_conn_pwd" );
private String CONNECTION_URL = "jdbc:microsoft:sqlserver://"
+ CONNECTION_SERVER_NAME + ":1433;DatabaseName="
+ CONNECTION_DBINSTANCE;
private SqlDAOFactory() {}
/**
*返回一个SqlDAOFactory对象
*@returnSqlDAOFactory类型对象
*/
publicstatic SqlDAOFactory newInstance() {
returnnew SqlDAOFactory();
}
/**
*得到一个Connection对象
*@returnjava.sql.Connection
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName( CONNECTION_DRIVER );
conn = DriverManager.getConnection(
CONNECTION_URL, CONNECTION_USER, CONNECTION_PWD );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
return conn;
}
}
MySqlDAPFactory.java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
publicclass MySqlDAOFactory extends DAOFactory {
privatestatic Properties prop = new Properties();
static {
try {
prop.load( OracleDAOFactory.class
.getResourceAsStream( "config.properties" ) );
} catch ( IOException e ) {
System.out.println( "File:config.properties no find,PLS check out!" );
e.printStackTrace();
}
}
private String CONNECTION_SERVER_NAME = prop
.getProperty( "mysql_server_name" );
private String CONNECTION_DRIVER = prop.getProperty( "mysql_conn_driver" );
private String CONNECTION_DBINSTANCE = prop
.getProperty( "mysql_dbInstance" );
private String CONNECTION_USER = prop.getProperty( "mysql_conn_user" );
private String CONNECTION_PWD = prop.getProperty( "mysql_conn_pwd" );
private String CONNECTION_URL = "jdbc:mysql://"
+ CONNECTION_SERVER_NAME + ":3306/" + CONNECTION_DBINSTANCE
+ "?useUnicode=true&characterEncoding=UTF-8";
private MySqlDAOFactory() {}
/**
*返回一个MySqlDAOFactory对象
*@returnMySqlDAOFactory类型对象
*/
publicstatic MySqlDAOFactory newInstance() {
returnnew MySqlDAOFactory();
}
/**
*得到一个Connection对象
*@returnjava.sql.Connection
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName( CONNECTION_DRIVER );
conn = DriverManager.getConnection(
CONNECTION_URL, CONNECTION_USER, CONNECTION_PWD );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
}
return conn;
}
}
修改config.properties配置文件:
#Oracle
oracle_server_name=localhost
oracle_conn_driver=oracle.jdbc.driver.OracleDriver
oracle_dbInstance=dy
oracle_conn_user=scott
oracle_conn_pwd=tiger
#SqlServer
sqlserver_server_name=localhost
sqlserver_conn_driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
sqlserver_dbInstance=test
sqlserver_conn_user=sa
sqlserver_conn_pwd=sa
#MySql
mysql_server_name=localhost
mysql_conn_driver=com.mysql.jdbc.Driver
mysql_dbInstance=test
mysql_conn_user=root
mysql_conn_pwd=root
最后,修改客户端文件DAOClient.java代码:
import java.sql.*;
public class DAOClient {
public static void main( String[] args ) {
DAOFactory dao = DAOFactory.getDAOFactory( DAOFactory.ORACLE );
Connection conn = dao.getConnection();
System.out.println( conn.toString() );
}
}
通过这种DAO+(Abstract)Factory方式,在将程序迁移到其它数据库中时,在客户端程序中几乎不用做修改,唯一需要做的,就是在获得DAOFactory对象的时候,修改相应的参数,例如,迁移到MySql下的时候:
DAOFactory dao = DAOFactory.getDAOFactory( DAOFactory.MYSQL );
发表评论
-
(转)Tomcat源码学习入门
2010-07-20 14:57 2030转自:http://hi. ... -
(转)信息数字化解逻辑题分享
2010-06-21 16:25 1102转自:http://www.iteye.com/topi ... -
二级域名
2009-07-23 12:38 1124转自:http://www.iteye.com/topi ... -
Eclipse快捷键的使用
2009-05-18 11:25 994转自:http://jiajun. ... -
gepai网上查询_java连接池
2009-05-13 16:14 931zx所交代码:gepai网上查询,使用了c3p0的连接方式,要 ... -
孙鑫的JAVA视频教学笔记
2009-05-07 11:11 11932008-11-101. 类变量,类方法,只归类所有,在 ... -
fckeditor的配置以及使用
2009-04-23 16:30 892题记: fckeditor搞了一个星期,终于在今天把它配置出来 ... -
风中叶老师的struts2类型转换第3集
2009-04-21 18:49 1221风中叶老师的struts2类型转换第3集 1. str ... -
javabean的一些发现
2009-04-19 12:12 875昨天在写一个javabean的时候, 发现它的set方法,竟 ... -
ftp默认登陆
2009-04-17 14:40 1482html代码是这样写: <!--StartFragme ... -
struts2的学习(入门配置及类型转换)
2009-04-17 00:07 912struts2的学习(入门配置及类型转换) 1. 入门配置: ... -
spring配置文件的解读
2009-04-16 09:59 974spring配置文件的解读 来自:《精通Spring》--罗 ... -
jericho---可用于抓取网上网页
2009-04-15 16:41 992jericho---可用于抓取网上网页 官方网站: htt ... -
看《精通Spring》--罗时飞 笔记
2009-04-11 23:42 1159在第三章 控制反转 第29页 1. 开发者将业务对象抽象成J ... -
java操作office文件
2009-04-10 11:11 1457转载自:http://blog.tostudy.com.cn ... -
使用junit进行单元测试
2009-04-09 19:01 1250myeclipse插件里已经集成了junit控件(放在JAV ... -
配置天乙论坛的步骤
2009-04-09 18:16 1029配置天乙论坛的步骤 1. 新建一个project: bbs2. ... -
软件架构师要读的书
2008-11-07 13:52 4671一、架构篇 1. 《Software Architectur ... -
看孙鑫视频的笔记
2008-11-11 15:38 9022008-11-101. 类变量,类方法,只归类所有,在内 ... -
关于重构的讲义
2008-12-11 14:46 938相关文章: AJAX表格 ...
相关推荐
使用数据访问对象(DAO,Data Access Object)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。可以降低商业逻辑层和数据访问层的耦合度,提高应用的可维护性和可移植性。 由于...
如何重构DAO模式源文件
重构 DAO tag java
DAO&MVC等模式.ppt 如何重构DAO模式.doc
《重构与模式》开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。《重构与模式》不仅展示了一种应用模式和重构的创新方法,...
DAO重构
本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新方法,而且有助于读者结合...
学习型设计模式重构代码
代码重构 重构与模式
这是一个很好的重构模式,设计方案,这是一个很好的重构模式,设计方案,这是一个很好的重构模式,设计方案,这是一个很好的重构模式,设计方案,这是一个很好的重构模式,设计方案,这是一个很好的重构模式,设计...
西南科技大学软件设计模式与重构大作业-心算大师游戏(高分作业)
内部培训资料 重构与设计模式
一共12个包,全下载解压 本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新...
一共12个包,全下载解压 本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新...
重构与模式 中文版 重构 模式
《设计模式》和《重构》之后又一里程碑式著作,凝聚众多业界专家经验与领悟,帮你打通重构与模式任督二脉。 1994年,《设计模式》为我们带来了常见设计问题的经典解决方案,从而改变了整个面向对象开发的面貌。 ...
本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新方法,而且有助于读者结合...
运用DAO和对象化进行重构_项目教程(2)_复习. 教程出自北大青鸟某老师。详细讲解了重构,受益匪浅。