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

JavaBean 進階:DAO 設計模式完整架構解析與分層實踐

     編輯:關於JSP

DAO 模式定位

Data Access Object (DAO):抽象封裝底層資料存取 (SQL/NoSQL/檔案),向上層提供**面向物件的 CRUD 介面**。屬於**資料層**,是企業級分層架構基石。

企業級四層架構

層次職責典型技術與 DAO 關係
**客戶層**瀏覽器、App、第三方 APIHTTP/REST/gRPC無感知
**表示層**Controller、View (JSP/Thymeleaf/React)Spring MVC、Struts調用 Service,不直接碰 DAO
**業務層 (Service/BO)**事務邊界、業務規則編排、多 DAO 組合Spring @Transactional、EJB**DAO 的直接消費者**
**資料層 (DAO)**單表/單實體原子操作:增刪改查、分頁、批次JPA/Hibernate、MyBatis、JdbcTemplate核心實現
**資源層**資料庫、檔案系統、快取、搜尋引擎MySQL、Redis、ES、S3DAO 底層依賴

DAO 組件六件套標準結構

  1. DatabaseConnection:專責連接獲取/關閉/事務邊界 (非 Spring 環境)。
  2. VO / Entity:屬性對應表欄位,get/set、Serializable、JPA 註解。
  3. DAO Interface:定義原子操作契約 save()、update()、delete()、findById()、findAll()...
  4. Impl (實現類):具體 SQL/HQL/JPQL 執行,**不負責連接管理**。
  5. Proxy (代理/裝飾器):攔截調用 → 開啟連接 → 委派 Impl → 關閉連接/處理異常 → 返回。實現 **AOP 關注點分離**。
  6. Factory (工廠):DAOFactory.getUserDAO() 返回 Proxy 包裝後的 DAO 實例,上層無感知具體實現。

代碼骨架示範 (User 模塊)

VO

public class UserVO implements Serializable {
    private Long id; private String username; private String email;
    // getters/setters
}

DAO Interface

public interface UserDAO {
    void save(UserVO user);
    void update(UserVO user);
    void delete(Long id);
    UserVO findById(Long id);
    List findAll();
}

Impl (JDBC 版)

public class UserDAOImpl implements UserDAO {
    private Connection conn;
    public UserDAOImpl(Connection conn) { this.conn = conn; }  // 連接由 Proxy 注入
    // 實現 CRUD 方法...
}

Proxy

public class UserDAOProxy implements UserDAO {
    private UserDAO target;
    public UserDAOProxy() { this.target = new UserDAOImpl(null); }
    public void save(UserVO user) {
        Connection conn = DBConnection.getConnection();
        try {
            ((UserDAOImpl)target).setConnection(conn);
            target.save(user);
            conn.commit();
        } catch (Exception e) { conn.rollback(); throw new RuntimeException(e); }
        finally { DBConnection.close(conn); }
    }
    // 其他方法同理...
}

Factory

public class DAOFactory {
    public static UserDAO getUserDAO() { return new UserDAOProxy(); }
    // 其他 DAO...
}

Service 層調用

public class UserService {
    private UserDAO userDAO = DAOFactory.getUserDAO();
    public void register(UserVO user) {
        // 業務規則:用戶名唯一、密碼加密、發送歡迎郵件...
        userDAO.save(user);
    }
}

現代化演進:從手工 DAO 到 JPA Repository / MyBatis Mapper

時代特徵代表技術
手工 JDBC + DAO 六件套樣板代碼多、連接管理易漏、SQL 分散早期 J2EE、Struts 1
Hibernate DAOORM 映射、Session 管理、HQLHibernate 3/4、Spring HibernateTemplate
Spring Data JPA接口即實現、方法名查詢、Specification 動態查詢interface UserRepo extends JpaRepository
MyBatis MapperSQL 完全控制、XML/註解映射、動態 SQL 強大@Mapper interface UserMapper
現代最佳實踐**領域驅動設計 (DDD) + Repository 模式** 領域層定義 Repository 接口,基礎設施層實現 (JPA/MyBatis)Spring Boot 3、Quarkus、Micronaut

避坑指南

  • DAO 暴露於 Controller:違反分層,導致事務邊界模糊。**Service 必須是 DAO 唯一調用者**。
  • 大而全的 BaseDAO:通用 save/update/delete 往往不夠用,業務查詢仍需自定義。**接口細分、按聚合根劃分 Repository**。
  • 忽略連接洩漏:手工管理連接必須 finally { close() }。**優先用框架聲明式事務**。
  • VO 滲漏業務邏輯:VO 僅屬性+存取器,驗證/計算/轉換屬於 Service/DTO。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved