DAO 類的職責與設計原則

1. DAO 的核心職責

DAO(Data Access Object,數據訪問對象)的主要職責是封裝對數據的訪問邏輯,但它與純粹的數據實體類(如 DTO、POJO)不同,也與 Service 業務邏輯層不同。

DAO 應該做什么?

??數據訪問操作

  • 執行數據庫 CRUD(增刪改查)操作

  • 提供查詢接口(如?findById,?findAll,?save,?delete

  • 處理數據庫事務(通常由?@Transactional?管理)

??數據轉換

  • 將數據庫實體(如?UserEntity)轉換為業務對象(如?User

  • 處理數據庫特有的數據類型(如?LocalDateTime?轉換)

??SQL/HQL/JPQL 管理

  • 編寫 SQL 查詢(如?@Query?或 XML 映射)

  • 處理分頁、排序等數據庫操作

DAO 不應該做什么?

??業務邏輯(屬于 Service 層):

  • 例如:計算訂單折扣、驗證用戶權限等

??HTTP 請求/響應處理(屬于 Controller 層):

  • 例如:解析?@RequestBody、返回?ResponseEntity

??直接暴露數據庫細節

  • 例如:不應該讓上層直接接觸?Connection?或?PreparedStatement


2. DAO 與實體類的區別

類別DAO 類實體類(Entity/DTO)
用途封裝數據訪問邏輯表示數據結構(數據庫表或 API 數據)
是否含邏輯有簡單的查詢邏輯通常只是數據容器(純 POJO)
示例UserRepository.findByName()User { id, name, email }
Spring 注解@Repository@Entity(JPA)或 無注解(DTO)

3. DAO 的典型實現方式

(1) Spring Data JPA(推薦)

@Repository
public interface UserRepository extends JpaRepository<User, Long> {// 自動實現基本 CRUDList<User> findByName(String name);  // 方法名自動解析為 SQL@Query("SELECT u FROM User u WHERE u.email LIKE %?1%")List<User> findByEmailContaining(String email);
}

特點

  • 方法名自動生成查詢(如?findByName?→?SELECT * FROM user WHERE name = ?

  • 支持?@Query?自定義 SQL/JPQL

(2) MyBatis(SQL 更靈活)

@Repository
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})")void insert(User user);
}

特點

  • 直接寫 SQL,適合復雜查詢

  • 需配合 XML 或注解映射

?(3) 傳統 JDBC(低層控制)

@Repository
public class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public User findById(Long id) {String sql = "SELECT * FROM user WHERE id = ?";return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);}
}

特點

  • 完全手動控制 SQL 和執行過程

  • 適合需要高度優化的場景

4. DAO 與 Service 的分工

DAO 層

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {List<Order> findByUserId(Long userId);
}

Service 層(業務邏輯)

@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;public BigDecimal calculateTotalPrice(Long userId) {List<Order> orders = orderRepository.findByUserId(userId);return orders.stream().map(Order::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);}
}

關鍵區別

  • DAO?只關心怎么查數據findByUserId

  • Service?關心業務計算(如匯總訂單金額)


5. 最佳實踐

  1. 保持 DAO 單一職責

    • 只做數據訪問,不混入業務邏輯。

  2. 使用接口 + 實現

    • 便于替換數據源(如從 MySQL 切到 MongoDB)。

  3. 避免“貧血 DAO”

    • 如果 DAO 只是簡單調用 JPA/MyBatis,可以直接用?Repository,無需額外封裝。

  4. 事務管理

    • 事務注解(@Transactional)通常放在 Service 層。

DAO(Data Access Object)層?在大多數現代Java應用中,特別是使用?MyBatis?或?JPA?框架時,通常對應你所說的?Mapper 類。不過具體實現方式可能略有不同,取決于你使用的技術棧。下面詳細解釋它們的關系和區別:

DAO 層和 Mapper 的關系

概念DAO(數據訪問對象)Mapper(MyBatis 術語)
定位數據訪問層,封裝數據庫操作MyBatis 對 DAO 的實現方式
技術實現可以是接口或類通常是接口(MyBatis)或 XML 映射文件
Spring 注解@Repository@Mapper(MyBatis)或?@Repository
典型方法insert(User user),?findById(Long id)@Select,?@Insert?等 SQL 注解方法

結論

  • DAO 是一個設計概念,表示數據訪問層。

  • Mapper 是 MyBatis 對 DAO 的具體實現方式(用接口+注解或XML定義SQL)。

  • 在 Spring + MyBatis 組合中,Mapper ≈ DAO


總結

  • DAO 類:負責數據訪問(查詢/存儲),有簡單邏輯(如 SQL 拼接),但不包含業務規則

  • 實體類:純數據結構,無邏輯,用于表示數據庫表或 API 數據。

  • Service 類:處理業務邏輯,調用 DAO 并組合數據。

合理分層能讓代碼更清晰、更易維護!?

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

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

相關文章

【Kubernetes】如何使用 kubeadm 搭建 Kubernetes 集群?還有哪些部署工具?

使用 kubeadm 搭建 Kubernetes 集群是一個比較常見的方式。kubeadm 是 Kubernetes 提供的一個命令行工具&#xff0c;它可以簡化 Kubernetes 集群的初始化和管理。下面是使用 kubeadm 搭建 Kubernetes 集群的基本步驟&#xff1a; 1. 準備工作 確保你的環境中有兩臺或更多的機…

Pycharm(十二)列表練習題

一、門和鑰匙 小X在一片大陸上探險&#xff0c;有一天他發現了一個洞穴&#xff0c;洞穴里面有n道門&#xff0c; 打開每道門都需要對應的鑰匙&#xff0c;編號為i的鑰匙能用于打開第i道門&#xff0c; 而且只有在打開了第i(i>1)道門之后&#xff0c;才能打開第i1道門&#…

在未歸一化的線性回歸模型中,特征的尺度差異可能導致模型對特征重要性的誤判

通過數學公式來更清晰地說明歸一化對模型的影響&#xff0c;以及它如何改變特征的重要性評估。 1. 未歸一化的情況 假設我們有一個線性回歸模型&#xff1a; y β 0 β 1 x 1 β 2 x 2 ? y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0?β1?x1?β2?x2?? 其…

JS—頁面渲染:1分鐘掌握頁面渲染過程

個人博客&#xff1a;haichenyi.com。感謝關注 一. 目錄 一–目錄二–頁面渲染過程三–DOM樹和渲染樹 二. 頁面渲染過程 瀏覽器的渲染過程可以分解為以下幾個關鍵步驟 2.1 解析HTML&#xff0c;形成DOM樹 瀏覽器從上往下解析HTML文檔&#xff0c;將標簽轉成DOM節點&#…

niuhe插件, 在 go 中渲染網頁內容

思路 niuhe 插件生成的 go 代碼是基于 github.com/ma-guo/niuhe 庫進行組織管理的, niuhe 庫 是對 go gin 庫的一個封裝&#xff0c;因此要顯示網頁, 可通過給 gin.Engine 指定 HTMLRender 來實現。 實現 HTMLRender 我們使用 gitee.com/cnmade/pongo2gin 實現 1. main.go …

openEuler24.03 LTS下安裝HBase集群

前提條件 安裝好Hadoop完全分布式集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝Hadoop3完全分布式 安裝好ZooKeeper集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝ZooKeeper集群 HBase集群規劃 node2node3node4MasterBackup MasterRegionServ…

LVGL移植說明

https://www.cnblogs.com/FlurryHeart/p/18104596 參考&#xff0c;里面說明了裸機移植以及freeRTOS系統移植。 移植到linux https://blog.csdn.net/sunchao124/article/details/144952514

ubuntu虛擬機裁剪img文件系統

1. 定制文件系統前期準備 將rootfs.img文件準備好&#xff0c;并創建target文件夾2. 掛載文件系統 sudo mount rootfs.img target #掛載文件系統 sudo chroot target #進入chroot環境3. 內裁剪文件系統 增刪裁剪文件系統 exit #退出chroot環境 sudo umount target…

esp826601s固件燒錄方法(ch340+面包板)

esp826601s固件燒錄方法&#xff08;ch340面包板&#xff09; 硬件 stm32f10c8t6&#xff0c;esp826601s,面包板&#xff0c;ch340(usb轉ttl),st_link&#xff08;供電&#xff09; 接線 燒錄時&#xff1a; stm32f10c8t6&#xff1a;gnd->負極&#xff0c; 3.3->正極…

Servlet 點擊計數器

Servlet 點擊計數器 引言 Servlet 是 Java 企業版&#xff08;Java EE&#xff09;技術中的一種服務器端組件&#xff0c;用于處理客戶端請求并生成動態內容。本文將詳細介紹如何使用 Servlet 實現一個簡單的點擊計數器&#xff0c;幫助讀者了解 Servlet 的基本用法和原理。 …

LangChain vs. LlamaIndex:深入對比與實戰應用

目錄 引言LangChain 與 LlamaIndex 概述 什么是 LangChain&#xff1f;什么是 LlamaIndex&#xff1f;兩者的核心目標與適用場景 架構與設計理念 LangChain 的架構設計LlamaIndex 的架構設計關鍵技術差異 核心功能對比 數據連接與處理查詢與檢索機制上下文管理能力插件與擴展性…

【Java中級】10章、內部類、局部內部類、匿名內部類、成員內部類、靜態內部類的基本語法和細節講解配套例題鞏固理解【5】

?? 【內部類】干貨滿滿&#xff0c;本章內容有點難理解&#xff0c;需要明白類的實例化&#xff0c;學完本篇文章你會對內部類有個清晰的認知 &#x1f495; 內容涉及內部類的介紹、局部內部類、匿名內部類(重點)、成員內部類、靜態內部類 &#x1f308; 跟著B站一位老師學習…

內容中臺:驅動多渠道營銷的關鍵策略

在數字營銷快速發展的今天&#xff0c;企業需要在多個渠道&#xff08;網站、社交媒體、移動應用等&#xff09;上同步管理內容。盡管網站仍是品牌展示的核心&#xff0c;但信息分散、多平臺重復創建內容的問題&#xff0c;讓營銷人員面臨巨大的管理挑戰。 內容中臺&#xff0…

SvelteKit 最新中文文檔教程(17)—— 僅服務端模塊和快照

前言 Svelte&#xff0c;一個語法簡潔、入門容易&#xff0c;面向未來的前端框架。 從 Svelte 誕生之初&#xff0c;就備受開發者的喜愛&#xff0c;根據統計&#xff0c;從 2019 年到 2024 年&#xff0c;連續 6 年一直是開發者最感興趣的前端框架 No.1&#xff1a; Svelte …

CMake 中的置變量

在 CMake 中&#xff0c;變量是存儲和傳遞信息的重要方式。以下是一些常用的 CMake 變量&#xff0c;以表格形式列出&#xff0c;包括它們的名稱、含義和常見用途&#xff1a; 變量名稱含義常見用途CMAKE_CURRENT_SOURCE_DIR當前處理的 CMakeLists.txt 文件所在的源代碼目錄的…

深入解析C++類:面向對象編程的核心基石

一、類的本質與核心概念 1.1 類的基本定義 類是將**數據&#xff08;屬性&#xff09;與操作&#xff08;方法&#xff09;**封裝在一起的用戶自定義類型&#xff0c;是面向對象編程的核心單元。 // 基礎類示例 class BankAccount { private: // 訪問控制string owner; …

介紹 Docker 的基本概念和優勢,以及在應用程序開發中的實際應用及數組講解

Docker 是一種輕量級的容器化技術&#xff0c;能夠讓開發者將應用程序和其所有依賴項打包成一個獨立的容器&#xff0c;實現快速部署和運行。以下是 Docker 的基本概念和優勢&#xff1a; 基本概念&#xff1a; 鏡像&#xff08;Image&#xff09;&#xff1a;鏡像是一個只讀的…

在msys2里面的mingw64下面編譯quickjs

其實非常的簡單&#xff0c;就是正常的make 和make install就行了&#xff0c;這里只是簡單的做個編譯過程記錄。 打開開始--程序--里面的msys64里面的mingw64控制臺窗口&#xff0c;切換到quickjs下載解壓縮后的目錄&#xff0c;執行make和make install ndyHP66G5 MINGW64 ~…

el-table實現表頭帶篩選功能,并支持分頁查詢

最開始嘗試了下面方法&#xff0c;發現這種方法僅支持篩選當前頁的數據&#xff0c;不符合產品要求 于是通過查詢資料發現可以結合filter-change事件&#xff0c;當表格的篩選條件發生變化的時候會觸發該事件&#xff0c;調接口獲取符合條件的數據&#xff0c;實現如下 1、表格…

OpenCV 從入門到精通(day_03)

1. ROI切割 ROI&#xff1a;Region of Interest&#xff0c;翻譯過來就是感興趣的區域。什么意思呢&#xff1f;比如對于一個人的照片&#xff0c;假如我們要檢測眼睛&#xff0c;因為眼睛肯定在臉上&#xff0c;所以我們感興趣的只有臉這部分&#xff0c;其他都不care&#xf…