首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深度解析 DAO 模式:封裝資料訪問邏輯、支援多数據源遷移的企業級設計模式實戰

     編輯:Java 相關知識

問題背景

J2EE 應用常需存取多種持久化存儲(RDBMS、LDAP、檔案等),各資料源 API 差異大。若業務元件直接耦合 JDBC/SQL,遷移資料庫將面臨大規模重寫。

DAO 模式核心角色

角色職責
BusinessObject業務邏輯元件,委託 DAO 存取資料
DataAccessObject (DAO)封裝特定資料源存取細節,提供統一介面
DataSource實體資料源(Oracle、MySQL、XML、LDAP...)
ValueObject (VO)資料傳輸載體,DAO 與 BusinessObject 間傳遞資料

DAO 類別圖

兩大實作策略

1. 自動代碼生成策略

  • 建立 BusinessObject ↔ DAO ↔ 資料表映射關係。
  • 自行開發代碼生成器,或採用成熟 ORM 工具(Hibernate、OJB、TopLink、Torque)以 GUI 映射並自動生成 DAO 代碼。
  • 工具通常附帶結果快取、查詢快取、分散式快取整合等增值功能。

2. DAO 工廠策略

結合 Abstract Factory / Factory Method,依資料源類型動態提供具體 DAO 實例。

  • 單一資料源類型:Factory Method 足矣(如僅支援 Oracle)。
  • 多資料源類型:Abstract Factory 定義 DAO 家族(CustomerDAO、AccountDAO...),每種資料源一個 Concrete Factory。

Factory Method 結構

Abstract Factory 結構

DAO 模式優缺點權衡

優點缺點
透明存取:業務邏輯不感知資料源細節增加額外抽象層,略增複雜度
遷移容易:僅替換 DAO 實作或工廠需設計完整類別階層(介面、實作、工廠)
降低業務代碼複雜度:SQL 集中於 DAOCMP Entity Bean 場景下容器已管理持久化,DAO 多餘
集中資料存取邏輯,利於維護效能微幅開銷(通常可忽略)

完整代碼範例

抽象工廠

public abstract class DAOFactory {
    public static final int CLOUDSCAPE = 1, ORACLE = 2, SYBASE = 3;
    public abstract CustomerDAO getCustomerDAO();
    public abstract AccountDAO getAccountDAO();
    public abstract OrderDAO getOrderDAO();
    public static DAOFactory getDAOFactory(int which) {
        switch(which) {
            case CLOUDSCAPE: return new CloudscapeDAOFactory();
            case ORACLE: return new OracleDAOFactory();
            case SYBASE: return new SybaseDAOFactory();
            default: return null;
        }
    }
}

具體工廠

public class CloudscapeDAOFactory extends DAOFactory {
    public static final String DRIVER = "COM.cloudscape.core.RmiJdbcDriver";
    public static final String DBURL = "jdbc:cloudscape:rmi://localhost:1099/CoreJ2EEDB";
    public static Connection createConnection() { /* 連線池實作 */ }
    public CustomerDAO getCustomerDAO() { return new CloudscapeCustomerDAO(); }
    public AccountDAO getAccountDAO() { return new CloudscapeAccountDAO(); }
    public OrderDAO getOrderDAO() { return new CloudscapeOrderDAO(); }
}

DAO 介面

public interface CustomerDAO {
    int insertCustomer(...);
    boolean deleteCustomer(...);
    Customer findCustomer(...);
    boolean updateCustomer(...);
    RowSet selectCustomersRS(...);
    Collection selectCustomersVO(...);
}

具體實作

public class CloudscapeCustomerDAO implements CustomerDAO {
    public int insertCustomer(...) { /* Cloudscape 專用 SQL */ }
    public Customer findCustomer(...) { /* 回傳 ValueObject */ }
    // ... 其他方法
}

ValueObject

public class Customer implements Serializable {
    int customerNumber; String name; String streetAddress; String city;
    // getter/setter
}

客戶端使用

DAOFactory factory = DAOFactory.getDAOFactory(DAOFactory.CLOUDSCAPE);
CustomerDAO dao = factory.getCustomerDAO();
int id = dao.insertCustomer(...);
Customer c = dao.findCustomer(...);
c.setAddress(...);
dao.updateCustomer(c);
Collection list = dao.selectCustomersVO(criteria);

結語

DAO 模式以「介面隔離實作、工廠解耦創建」為核心,配合 ORM 代碼生成或手工實作,能構建靈活、可遷移、易維護的企業級資料存取層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved