J2EE模式---數據訪問對象模式

數據訪問對象模式基礎概念

數據訪問對象模式(Data Access Object Pattern,簡稱 DAO 模式)是一種結構型設計模式,其核心思想是將數據訪問邏輯與業務邏輯分離,通過一個抽象層(DAO)來處理數據的持久化和檢索操作,使業務層無需關心數據存儲的細節(如數據庫類型、連接管理等)。這種模式提高了代碼的可維護性和可測試性,尤其適用于企業級應用中數據訪問層的設計。

數據訪問對象模式的核心組件

  1. 數據訪問對象接口(DAO Interface)

    • 定義數據訪問操作的抽象方法(如 CRUD 操作)
    • 為不同的數據訪問實現提供統一的接口
  2. 數據訪問對象實現(DAO Implementation)

    • 實現 DAO 接口,處理具體的數據訪問邏輯
    • 包含與數據庫或其他數據源的交互代碼
  3. 模型對象 / 值對象(Model/Value Object)

    • 表示業務數據的實體類
    • 通常是簡單的 POJO(Plain Old Java Objects),包含屬性和 getter/setter 方法
  4. 工廠類(Factory Class)

    • 負責創建 DAO 實例的工廠
    • 隱藏 DAO 實現的創建細節,提供統一的獲取方式

數據訪問對象模式的工作流程

  1. 業務層調用:業務層通過 DAO 接口調用數據訪問方法
  2. DAO 實現處理:具體的 DAO 實現類處理數據訪問請求
  3. 數據源交互:DAO 實現與數據源(如數據庫、文件系統)交互
  4. 數據轉換:將數據源中的數據轉換為模型對象,或反之
  5. 結果返回:將處理結果返回給業務層

數據訪問對象模式的實現

下面通過一個簡單的 Java 示例展示數據訪問對象模式的實現:

// 1. 模型對象 - 用戶
class User {private int id;private String name;private String email;public User(int id, String name, String email) {this.id = id;this.name = name;this.email = email;}// Getters and setterspublic int getId() { return id; }public void setId(int id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }
}// 2. DAO接口
interface UserDAO {List<User> getAllUsers();User getUserById(int id);void saveUser(User user);void deleteUser(User user);
}// 3. DAO實現 - 使用JDBC訪問數據庫
class UserDAOImpl implements UserDAO {private static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";private static final String DB_USER = "root";private static final String DB_PASSWORD = "password";@Overridepublic List<User> getAllUsers() {List<User> users = new ArrayList<>();String sql = "SELECT * FROM users";try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");String email = rs.getString("email");users.add(new User(id, name, email));}} catch (SQLException e) {e.printStackTrace();}return users;}@Overridepublic User getUserById(int id) {String sql = "SELECT * FROM users WHERE id = ?";User user = null;try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, id);try (ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {String name = rs.getString("name");String email = rs.getString("email");user = new User(id, name, email);}}} catch (SQLException e) {e.printStackTrace();}return user;}@Overridepublic void saveUser(User user) {String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, user.getId());pstmt.setString(2, user.getName());pstmt.setString(3, user.getEmail());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}@Overridepublic void deleteUser(User user) {String sql = "DELETE FROM users WHERE id = ?";try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, user.getId());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}
}// 4. DAO工廠
class DAOFactory {public static UserDAO getUserDAO() {return new UserDAOImpl();}
}// 5. 客戶端代碼
public class DAOPatternDemo {public static void main(String[] args) {// 獲取DAO實例UserDAO userDAO = DAOFactory.getUserDAO();// 創建用戶User newUser = new User(1, "John Doe", "john@example.com");userDAO.saveUser(newUser);// 獲取所有用戶List<User> users = userDAO.getAllUsers();System.out.println("所有用戶:");for (User user : users) {System.out.println("ID: " + user.getId() + ", 姓名: " + user.getName() + ", 郵箱: " + user.getEmail());}// 根據ID獲取用戶User user = userDAO.getUserById(1);System.out.println("\nID為1的用戶: " + user.getName());// 刪除用戶userDAO.deleteUser(user);System.out.println("\n刪除用戶后,所有用戶:");users = userDAO.getAllUsers();for (User u : users) {System.out.println("ID: " + u.getId() + ", 姓名: " + u.getName());}}
}

數據訪問對象模式的應用場景

  1. 企業級應用?- 如 ERP、CRM 系統中,分離業務邏輯與數據庫訪問
  2. 多層架構?- 在 MVC、三層架構中,作為數據訪問層的標準實現
  3. 異構數據源?- 訪問不同類型的數據源(如關系型數據庫、NoSQL 數據庫)
  4. 測試場景?- 便于在單元測試中使用模擬 DAO 替代真實數據訪問
  5. 數據緩存?- 在 DAO 層實現緩存機制,提高數據訪問性能
  6. ORM 框架?- 如 Hibernate、MyBatis 等框架的設計基礎

數據訪問對象模式的優缺點

優點

  1. 分離關注點?- 業務邏輯與數據訪問邏輯分離,提高代碼可維護性
  2. 降低耦合度?- 業務層與數據訪問層松耦合,便于獨立修改和測試
  3. 提高可測試性?- 可通過模擬 DAO 實現簡化單元測試
  4. 支持多數據源?- 可輕松切換不同的數據源實現(如從 MySQL 到 Oracle)
  5. 集中管理?- 數據訪問邏輯集中在 DAO 中,便于統一優化和維護
  6. 符合開閉原則?- 可在不修改業務層的情況下擴展或修改 DAO 實現

缺點

  1. 代碼冗余?- 每個實體類都需要對應的 DAO 接口和實現,可能導致代碼量增加
  2. 學習曲線?- 對于簡單應用,引入 DAO 模式可能增加復雜度
  3. 性能開銷?- 多層抽象可能引入額外的性能開銷
  4. 維護挑戰?- 如果 DAO 實現不當,可能導致大量重復代碼或難以維護的邏輯
  5. 事務管理復雜?- 在跨多個 DAO 的事務中,管理一致性可能變得復雜

使用數據訪問對象模式的最佳實踐

  1. 接口設計?- DAO 接口應基于業務需求而非底層數據源
  2. 異常處理?- DAO 應處理數據訪問異常,向上層拋出業務異常
  3. 資源管理?- 確保數據庫連接等資源被正確關閉(如使用 try-with-resources)
  4. 批處理支持?- 為批量操作提供專門的方法,提高性能
  5. 緩存機制?- 在 DAO 層實現適當的緩存策略,減少數據庫訪問
  6. 事務管理?- 結合使用事務管理器確保數據一致性
  7. 日志記錄?- 在 DAO 中添加必要的日志記錄,便于調試和監控
  8. 使用 ORM 框架?- 對于復雜應用,考慮使用 Hibernate、MyBatis 等 ORM 框架簡化 DAO 實現

總結

數據訪問對象模式通過抽象數據訪問邏輯,實現了業務層與數據持久層的解耦,是企業級應用中數據訪問層的標準設計模式。它在提高代碼可維護性、可測試性和支持多數據源等方面具有顯著優勢,但需要合理設計以避免過度復雜。在實際開發中,DAO 模式常與其他模式(如工廠模式、單例模式)結合使用,并可借助 ORM 框架進一步簡化實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92919.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【OpenCV篇】OpenCV——02day.圖像預處理(1)

目錄 前言 一、圖像色彩空間轉換 1 RGB顏色空間 2 顏色加法 3 顏色加權加法 4 HSV顏色空間 5 RGB轉Gray(灰度) 二、灰度實驗 1 灰度圖 2 最大值法 3 平均值法 4 加權均值法 5 兩個極端的灰度值 三、圖像二值化處理 二值圖像 1 閾值法(THRESH_BINARY) 2 反閾值…

經典IDE之Turbo C

寫的程序不多&#xff0c;換過的 IDE 不少&#xff0c;本文將列舉曾經用過的不同 C 語言相關的 IDE 環境&#xff0c;既是紀念&#xff0c;也是回憶。值得注意的是 IDE 的出現是為了提高開發效率&#xff0c;有一個相對成熟的編譯環境和程序。從編程的角度來看&#xff0c;過分…

Go 多模塊倉庫標簽管理教程

為了方便自己開發&#xff0c;自己寫了個小工具&#xff1a;DzhGO 代碼生成工具 功能特點標題 初始化項目基礎結構生成插件模塊代碼生成模型和實體代碼生成服務接口和實現代碼支持 admin 和 app 兩種模塊類型生成項目基礎目錄 具體介紹看倉庫&#xff1a; https://github.co…

IDEA 類上方注釋 簽名

File -->settings–>Editor–>File and Code Templates–>class新建 Class 類上方添加內容&#xff1a;/*** author Jagger* since ${DATE} ${TIME}*/

衛星通信終端天線對星之:參考星對星

我們在前面的文章中介紹了3種衛星通信終端的對星模式&#xff0c;分別是&#xff1a; 衛星通信終端天線的5種對星模式之一&#xff1a;信標跟蹤 衛星通信終端天線的5種對星模式之二&#xff1a;功率檢測型載波跟蹤 衛星通信終端天線的5種對星模式之二&#xff1a;DVB跟蹤 今…

來自麻省理工和AI制藥公司 Recursion 的結構與結合親和力預測模型Boltz-2,解決小分子藥物發現的關鍵問題

1. Boltz-2介紹 文章來源&#xff1a;http://jeremywohlwend.com/assets/boltz2.pdf 開源代碼來源&#xff1a;https://github.com/jwohlwend/boltz 該AI模型由麻省理工學院計算機科學與人工智能實驗室與上市AI制藥公司Recursion一起開發&#xff0c;雙方在Boltz-1的基礎之上…

從零用java實現 小紅書 springboot vue uniapp(14) 集成阿里云短信驗證碼

從零用java實現 小紅書 springboot vue uniapp&#xff08;14&#xff09; 集成阿里云短信驗證碼 移動端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 項目整體介紹及演示 前言 在現代應用中&#xff0c;手機號不僅是用戶的唯一標識&#xff0…

`<< EOF` 與 `<< ‘EOF‘` 與 `<< “EOF“`有無引號的區別多回答筆記250722

<< EOF 與 << EOF 與 << "EOF"有無引號的區別多回答筆記250722 實測 自測代碼: # 定義變量 hello"ni hao"# 無引號 tee << EOF # 無引號 ${hello} world \n $(date) # 無引號 EOF# 單引號 tee << EOF # 單…

點擊按鈕滾動到底功能vue的v-on:scroll運用

使用vue自帶的監聽滾動功能v-on:scroll&#xff0c;滾動條變化時&#xff0c;會調用方法 checkScrollStatus&#xff0c;如果滾動條在容器底部時&#xff0c;則隱藏按鈕&#xff0c;否則顯示按鈕&#xff0c;點擊按鈕能一鍵滾動到底部。<div class"chat-area" ref…

Linux下編譯SLEPc

本文記錄在Linux下編譯安裝SLEPc的流程。 一、下載代碼 git clone https://github.com/slepc/slepc.git cd ./slepc二、安裝依賴 2.1 安裝PETSc 參見: <Linux下編譯安裝PETSc> 2.2 安裝intel oneAPI sudo apt install intel-oneapi-base-toolkit sudo apt install i…

【無標題】qwen3-8b 強化學習訓練后的模型,可以接著 進行其他grpo 強化學習訓練 嗎

ser_count’, 0),)} {((‘valid_user_count’, 1),)} 44 0.0 88 [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6, 0.0, 0.6, 0.0, 0.6] 55 100%|???{‘loss’: 0.0132, ‘grad_norm’: 0.07552657276391983, ‘learning_rate’: 2e-06, ‘num_tokens’: 2098…

IDC權威認可:瑞數信息雙項入選《中國大模型安全保護市場概覽》

近日&#xff0c;國際數據公司IDC正式發布了《中國大模型安全保護市場概覽&#xff0c;2025&#xff1a;全方位安全檢測與防護構建可信AI》報告。本次報告中IDC結合全球統一定義以及中國市場特色&#xff0c;將中國大模型安全保護市場劃分為7個細分領域&#xff0c;并通過對中國…

多智能體(Multi-agent)策略模式:思維鏈CoT和ReAct

參考&#xff1a;https://zhuanlan.zhihu.com/p/704523060 &#x1f3af; 一句話記住 CoT&#xff1a;像“考試時在草稿紙上寫完所有步驟&#xff0c;再抄答案”。ReAct&#xff1a;像“玩密室逃脫&#xff0c;每開一個箱子就去找下一個線索”。 用小學生能聽懂的話 兩個小故事…

ChatGPT指令大全:輸入需求=輸出完整方案

ChatGPT指令大全提供數百個精煉過的指令語句 (提示詞)&#xff0c;讓你充分發揮 ChatGPT 的強大功能 一、核心功能模塊分類 1. 求職與面試 簡歷優化 專業反饋&#xff1a;按面試官視角分析簡歷并提出改進建議量化數據&#xff1a;為經歷添加具體數字&#xff08;如提升效率30…

Java零基礎入門學習知識點2-JDK安裝配置+Maven

文章目錄版本提示參考視頻Maven環境準備一、安裝Java開發工具包&#xff08;JDK&#xff09;二、JDK環境配置三、下載Maven安裝包*四、Maven環境配置&#xff08;可省略&#xff09;*五、驗證安裝&#xff08;上一步沒做&#xff0c;這步無法驗證&#xff0c;可省&#xff09;六…

基于單片機智能衣柜/智能衣櫥設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的多功能智能衣柜&#xff0c;融合環境檢測、安全防護與用戶交互功能…

自動語音識別(ASR)技術詳解

語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能和自然語言處理領域的重要技術&#xff0c;旨在將人類的語音信號轉換為對應的文本。近年來&#xff0c;深度學習的突破推動語音識別系統從實驗室走入日常生活&#xff0c;為智能助手、實時翻譯、醫…

【MySQL】MySQL 事務和鎖詳解

一、MySQL 事務 1.1 事務介紹 在 MySQL 中&#xff0c;事務&#xff08;Transaction&#xff09; 是一組不可分割的 SQL 操作序列&#xff0c;這些操作要么全部成功執行&#xff0c;要么全部失敗回滾&#xff0c;以此保證數據庫操作的完整性和一致性。 事務將數據庫從一種一致…

虛擬直線閾值告警人員計數算法暑期應用

智慧人員計數助力暑期&#xff1a;技術賦能安全管理的創新實踐一、背景&#xff1a;暑期人流激增下的安全管理挑戰暑期是旅游、商業、交通等場景的客流高峰期&#xff0c;人員密集區域易引發踩踏事故、管理混亂等安全隱患。傳統人工計數方式效率低、誤差大&#xff0c;難以滿足…

SQL164 2021年11月每天新用戶的次日留存率

SQL164 2021年11月每天新用戶的次日留存率 思路 ?找出新用戶?&#xff1a;確定每個用戶首次活躍的日期&#xff08;即新用戶&#xff09; 例如101用戶在11月1日首次出現 ?處理跨天活躍?&#xff1a;考慮用戶可能跨天活躍的情況&#xff08;in_time和out_time不在同一天&a…