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

Java 入門:DAO 設計模式完整指南

     編輯:Java 相關知識

什麼是 DAO?

DAO (Data Access Object) 資料存取物件,負責封裝與資料庫的所有互動。夾在業務邏輯層與資料庫資源中間,提供抽象介面隔離資料存取細節。

DAO 核心功能

  1. 封裝 Data Source 連線細節:如 Connection conn = DAOFactory.createConnection(),將 Driver、URL、username、password 等封裝在 DAO 內部。未來切換資料庫(如 MSSQL 換 Oracle)只需修改 DAOFactory.getConnection() 實作,業務邏輯完全不受影響。
  2. 封裝資料庫操作 (CRUD):如新增使用者,DAO 僅對外暴露 insertUser(User user),具體 SQL 執行細節隱藏在實作類別中。呼叫端只需知道方法用途,無需知曉實作細節。

DAO 搭配 Abstract Factory 模式

通常 DAO 與 抽象工廠模式 搭配使用:Factory 負責建立資料庫連線與定位具體 DAO(如 UserDao、CustomerDao)。常將 getConnection() 設為 static,或將 Hibernate SessionFactory 等公共類別放入 Abstract Factory 中。

程式碼架構範例

1. DAO Factory(抽象工廠)

public class DAOFactory {
    private static final SessionFactory sessionFactory;
    
    // ThreadLocal 管理 Session
    static Session currentSession() { ... }
    
    public UserDao getUserDAO() { 
        return new UserDaoImpl(currentSession()); 
    }
    
    public OtherDao getOtherDAO() { 
        return new OtherDaoImpl(currentSession()); 
    }
    // ... 其他 DAO 獲取方法
}

2. DAO 介面

public interface UserDao {
    public void insertUser(FormBean formBean);
    public void updateUser(FormBean formBean);
    // 其他業務方法...
}

3. DAO 實作類別

public class UserDaoImpl implements UserDao {
    private Session session;
    
    public UserDaoImpl(Session session) {
        this.session = session;
    }
    
    public void insertUser(FormBean formBean) {
        // 轉換 FormBean -> UserPO
        // session.save(userPO);
        // 轉換 UserPO -> FormBean 返回
    }
    
    public void updateUser(FormBean formBean) {
        // session.update(userPO);
    }
}

4. 持久化物件 (PO)

public class UserPO {
    private String firstname;
    private String lastname;
    private String password;
    // getter/setter...
}

分層架構優勢

  • 關注點分離:業務邏輯專注業務規則,資料存取細節封裝在 DAO 層
  • 可測試性:可輕易用 Mock DAO 進行單元測試
  • 可維護性:SQL 變更、資料庫遷移只影響 DAO 實作層
  • 可替換性:支援多種資料庫實作,運行時動態切換
  • 事務管理集中化:在 Service 層或透過 AOP 統一管理事務邊界

最佳實踐建議

  1. DAO 介面定義粒度以聚合根或業務實體為單位,避免過度細碎
  2. 使用 泛型 DAO 基類減少重複 CRUD 程式碼
  3. 引入 Spring Data JPA 或 MyBatis 等成熟框架簡化實作
  4. 區分 DAO(資料存取)與 Repository(領域模型存取)概念
  5. 妥善處理 Session/EntityManager 生命週期(ThreadLocal、Open Session in View 等模式)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved