沒有哪個 DAO 能夠包攬所有的數據庫管理。每種 DAO 都有各自的定位。我們公司的項目有這樣一些特點:
- 所用數據庫都是 Oracle;
- 使用一些已有的數據庫表;
- 查詢語句要經過優化,DBA 要對其字斟句酌;
- 同時連接多個數據庫。
我們的項目大都會用到一些其他系統現有的表。有的表包含四五十個字段,而對于某些業務邏輯來講只需要查詢一兩個字段的值。DBA 強烈反對“select * ”,對關聯查詢、嵌套查詢的性能要求也很嚴格。所以像 Hibernate 這樣自動生成 SQL 語句的 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、用戶名和密碼四個參數。密碼暫時不考慮加密,采用明文的方式。下面是一個配置文件的例子:
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");?
- 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行)進行查詢。