2007-02-27
DAO 设计1、DAO 配置文件的设计
没有哪个 DAO 能够包揽所有的数据库管理。每种 DAO 都有各自的定位。我们公司的项目有这样一些特点:
本着够用就行的原则,我们设计的 DAO (下面简称 DAO)先定下一个很低的目标:实现数据库连接管理,SQL 语句由使用者提供,将查询结果进行简单的封装。
数据库连接管理的具体设计是:
1、使用 XML 配置文件配置数据库连接;
2、支持 JDBC 和 JNDI(主要针对 WebLogic 的连接池) 两种方式创建数据库连接;
3、对同时连接多个数据库进行管理;
4、使用者不需关心数据库连接的创建和关闭。
对 XML 配置文件的设计:
DAO 配置文件用来配置数据库连接。鉴于当前的目标,DAO 没有映射关系配置。
配置文件将数据库抽象为“数据源”(DataSource),DAO 管理的是数据源。一个项目中可以存在多个数据源。数据源包含一个或多个连接配置,但运行时只会启用其中的一个,这样是为了方便修改配置,像 Rails 的 数据库配置文件中同时配置了开发环境、测试环境和产品环境三中数据库连接,一样的道理。
连接配置有 JNDI 和 JDBC 两种类型,分别需要不同的参数。JNDI 配置需要 JNDI 服务器、InitialContextFactory 类和 JNDI 名称三个参数,而JDBC 配置需要 Driver、url、用户名和密码四个参数。密码暂时不考虑加密,采用明文的方式。下面是一个配置文件的例子:
那么使用者如何使用 DAO 执行 SQL 呢?下面是一个最简单的例子:
在这个例子中,DAO 根据配置文件找到数据源“demo”(17行),再根据数据源的 connection 属性找到名为"jdbc_connection" 的连接配置(27行),然后连接到 "jdbc:oracle:thin:@127.0.0.1:1521:SidName" (30行)进行查询。
待续...
- 所用数据库都是 Oracle;
- 使用一些已有的数据库表;
- 查询语句要经过优化,DBA 要对其字斟句酌;
- 同时连接多个数据库。
本着够用就行的原则,我们设计的 DAO (下面简称 DAO)先定下一个很低的目标:实现数据库连接管理,SQL 语句由使用者提供,将查询结果进行简单的封装。
数据库连接管理的具体设计是:
1、使用 XML 配置文件配置数据库连接;
2、支持 JDBC 和 JNDI(主要针对 WebLogic 的连接池) 两种方式创建数据库连接;
3、对同时连接多个数据库进行管理;
4、使用者不需关心数据库连接的创建和关闭。
对 XML 配置文件的设计:
DAO 配置文件用来配置数据库连接。鉴于当前的目标,DAO 没有映射关系配置。
配置文件将数据库抽象为“数据源”(DataSource),DAO 管理的是数据源。一个项目中可以存在多个数据源。数据源包含一个或多个连接配置,但运行时只会启用其中的一个,这样是为了方便修改配置,像 Rails 的 数据库配置文件中同时配置了开发环境、测试环境和产品环境三中数据库连接,一样的道理。
连接配置有 JNDI 和 JDBC 两种类型,分别需要不同的参数。JNDI 配置需要 JNDI 服务器、InitialContextFactory 类和 JNDI 名称三个参数,而JDBC 配置需要 Driver、url、用户名和密码四个参数。密码暂时不考虑加密,采用明文的方式。下面是一个配置文件的例子:
xml 代码
- <?xml version="1.0" encoding="GB2312" ?>
- <!DOCTYPE dao-config PUBLIC
- "-//Chinacreator, Ltd.//Data Access Object Library 1.2//CN" "dao-config.dtd">
- <dao-config>
- <datasource name="local_mysql" connection="default">
- <description>数据源1</description>
- <connection name="default" type="jdbc">
- <property name="driver" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost/test"/>
- <property name="username" value="user"/>
- <property name="password" value="user"/>
- </connection>
- </datasource>
- <datasource name="demo" connection="jdbc_connection">
- <description>数据源2</description>
- <connection name="jndi_connection" type="jndi">
- <description>JNDI 方式</description>
- <property name="driver" value="weblogic.jndi.WLInitialContextFactory"/>
- <property name="server" value="t3://127.0.0.1:7010"/>
- <property name="jndiname" value="jndi/name"/>
- </connection>
- <connection name="jdbc_connection" type="jdbc">
- <description>JDBC 方式</description>
- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
- <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:SidName"/>
- <property name="username" value="username"/>
- <property name="password" value="password"/>
- </connection>
- <connection name="pooled_jdbc" type="jdbc">
- <description>带连接池的 JDBC 方式</description>
- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
- <property name="url" value="jdbc:oracle:thin:@172.16.168.85:1521:ora9i01"/>
- <property name="username" value="username"/>
- <property name="password" value="password"/>
- <property name="usepool" value="true"/>
- <property name="poolsize" value="2"/>
- </connection>
- </datasource>
- </dao-config>
那么使用者如何使用 DAO 执行 SQL 呢?下面是一个最简单的例子:
java 代码
- DAO dao = DAO.getDAO("demo"); // "demo" 是数据源的名称,见配置文件 17 行
- List list = dao.query("select areaname from tb_pub_area_code");
- assertEquals("长沙", list.get(0));
在这个例子中,DAO 根据配置文件找到数据源“demo”(17行),再根据数据源的 connection 属性找到名为"jdbc_connection" 的连接配置(27行),然后连接到 "jdbc:oracle:thin:@127.0.0.1:1521:SidName" (30行)进行查询。
待续...
评论
itroop
2007-04-03
我正在学习这个希望版主能发个配置数据源获得数据源链接访问数据库的实例工程
andyandyandy
2007-04-03
这是探索精神,好,支持楼主的好东西
ak478288
2007-04-02
这不是重复的发明轮子,而是开拓思维的方式,如果不开拓思维,就不会有多样化的技术产生
elfer
2007-03-30
支持原创,为什么不自己多想想,要用别人的呢??
yananay
2007-03-07
你们得写事务控制,2段式提交等等,
其实用 spring + ibatis,这样的东西都很好实现。
ibatis也不是特别麻烦,有精力重复一个轮子,
不如弄一个方便ibatis的工具.
其实用 spring + ibatis,这样的东西都很好实现。
ibatis也不是特别麻烦,有精力重复一个轮子,
不如弄一个方便ibatis的工具.
yiding_he
2007-03-06
当时的想法是 DAO 包最好独立,不根任何框架有联系(Log4j除外)。
刑天战士
2007-03-05
why not use spring instead of a home-made xml configuration?
retreat
2007-03-05
hb本身也可以配置多个的ds的!why?why?why? 搞不通why?
21jhf
2007-03-05
等待你继续.........
yiding_he
2007-02-27
iBatis 我早就看过,它还是太麻烦了。本文提到的 DAO 实际上已经完成,这篇文章(目前只是第一篇)是一个回顾性的东西,希望能对有兴趣的朋友提供一点价值。
Ivan Li
2007-02-27
你看看iBatis,就不会重复发明轮子了
- 浏览: 127800 次
- 性别:

- 来自: 湖南

- 详细资料
搜索本博客
我的相册
olm.png
共 7 张
共 7 张
最近加入圈子
最新评论
-
领悟 JavaScript 中的面向 ...
看一下这篇文章: http://msdn2.microsoft.com/zh-c ...
-- by bopat -
一个对象等待多个线程
好贴正需要。
-- by dongfei999 -
TrueCrypt 为你保驾护航.. ...
这两个目录的名字很诱人啊~
-- by ddppfamily -
领悟 JavaScript 中的面向 ...
楼主辛苦了!这样的文章不错!提倡
-- by sunfengcheng -
在 JavaScript 中如何创建 ...
实在是妙啊!
-- by yvfish






评论排行榜