PO、BO、VO、DTO、POJO、DAO、DO基本概念

一、圖解

在這里插入圖片描述

二、相關概念

1、PO(Persistant Object - 持久化對象)

核心定位:

  • 直接與數據庫表結構一一映射的對象,通常用于 ORM(對象關系映射)框架(如 MyBatis、Hibernate)中。

特點:

  • 字段與數據庫表的列完全對應(包括數據類型、字段名)。
  • 通常包含 getter/setter 方法,可能有默認構造方法。
  • 不包含復雜的業務邏輯,僅作為數據的載體。
  • 生命周期與數據庫操作相關,常用于數據庫的 CRUD(增刪改查)操作。

示例代碼:

// 與數據庫user表一一映射的PO類
public class UserPO {private Long id;         // 對應表中id列private String username; // 對應表中username列private Integer age;     // 對應表中age列// getter/setter方法
}

2、BO(Business Object - 業務對象)

在 Java 開發中,BO(Business Object,業務對象) 是封裝了業務邏輯和業務規則的對象,主要用于實現核心業務功能,是業務邏輯層的核心組件。

BO 的核心特點:

  • 包含業務邏輯: BO 是業務規則、計算邏輯、流程控制的載體,例如訂單狀態流轉、價格計算、權限校驗等核心業務邏輯都在 BO 中實現。
  • 依賴數據層: BO 通常會調用 DAO(數據訪問對象)獲取數據,或通過 DTO/PO 接收數據,經過業務處理后返回結果(可能轉換為 VO/DTO)。
  • 代表業務概念: BO 的設計與業務領域緊密相關,例如OrderBO(訂單業務對象)、PaymentBO(支付業務對象)等,對應實際業務中的實體或流程。

BO 與其他對象的關系:
在典型的分層架構中,BO 處于核心位置,協調各層數據流轉:

視圖層(VO) ←→ 控制層 ←→ 業務層(BO) ←→ 數據訪問層(DAO) ←→ 數據源(PO/DO)
  • BO 接收從控制層傳遞的 DTO 數據,或通過 DAO 獲取 PO/DO 數據。
  • 對數據進行業務處理(如驗證、計算、狀態轉換等)。
  • 將處理結果轉換為 VO 或 DTO,返回給上層(控制層或其他服務)。

示例代碼:
以訂單業務為例,OrderBO 封裝訂單創建的核心邏輯:

// 訂單業務對象(BO)
public class OrderBO {// 依賴訂單DAO和商品DAOprivate OrderDAO orderDAO;private ProductDAO productDAO;// 構造方法注入依賴(實際開發中常用Spring注入)public OrderBO(OrderDAO orderDAO, ProductDAO productDAO) {this.orderDAO = orderDAO;this.productDAO = productDAO;}/*** 創建訂單的核心業務邏輯*/public OrderVO createOrder(OrderDTO orderDTO) {// 1. 業務校驗:檢查商品庫存ProductPO product = productDAO.getById(orderDTO.getProductId());if (product.getStock() < orderDTO.getQuantity()) {throw new BusinessException("商品庫存不足");}// 2. 業務計算:計算訂單金額(含折扣)BigDecimal totalAmount = calculateTotalAmount(product.getPrice(), orderDTO.getQuantity());// 3. 封裝訂單數據(PO)并保存到數據庫OrderPO orderPO = new OrderPO();orderPO.setUserId(orderDTO.getUserId());orderPO.setProductId(orderDTO.getProductId());orderPO.setQuantity(orderDTO.getQuantity());orderPO.setTotalAmount(totalAmount);orderPO.setStatus("CREATED"); // 設置初始狀態orderDAO.save(orderPO);// 4. 更新商品庫存productDAO.decreaseStock(product.getId(), orderDTO.getQuantity());// 5. 轉換為VO返回給前端OrderVO orderVO = new OrderVO();orderVO.setOrderId(orderPO.getId());orderVO.setTotalAmount(totalAmount);orderVO.setStatus("已創建");return orderVO;}// 私有方法:封裝折扣計算邏輯private BigDecimal calculateTotalAmount(BigDecimal price, int quantity) {BigDecimal total = price.multiply(new BigDecimal(quantity));// 應用折扣規則(例如滿100減10)if (total.compareTo(new BigDecimal(100)) >= 0) {return total.subtract(new BigDecimal(10));}return total;}
}

BO 與 Service 的關系:
在實際開發中,BO 和 Service 常被混用,尤其是在 Spring 框架中:

  • 很多團隊直接將@Service注解的類視為 BO,因為它們同樣承載業務邏輯。
  • 嚴格來說,BO 更偏向 “業務實體的邏輯封裝”,而 Service 可能包含多個 BO 的協同(如跨領域的業務流程)。

但核心思想一致:BO 是業務邏輯的載體,負責實現系統的核心業務規則和流程。

總結:
BO 的核心價值在于集中管理業務邏輯,使業務規則可復用、易維護,同時隔離業務邏輯與數據訪問、視圖展示等其他關注點,是分層架構中實現 “高內聚、低耦合” 的重要組件。

3、DO(Data Object - 數據對象)

核心定位:

  • 更廣義的數據載體,可用于表示任意數據源的數據(不僅限于數據庫),如緩存、消息隊列、文件等。

特點:

  • 字段與數據源的結構對應,但數據源可以是多樣的(不一定是數據庫表)。
  • 同樣以數據存儲和傳遞為主要目的,通常也不含復雜業務邏輯。
  • 概念范圍比 PO 更廣,PO 可以視為 DO 的一種特殊情況(當數據源為數據庫時)。

示例:

// 從緩存中讀取的用戶數據對象(DO)
public class UserDO {private String userId;   // 緩存中的用戶IDprivate String nickName; // 緩存中的昵稱private Long cacheTime;  // 緩存時間(非數據庫字段)// getter/setter方法
}

實際開發中的使用:

  • 在純數據庫操作場景中,PO 和 DO 可能被混用(此時 DO 即 PO)。
  • 在復雜系統中(如包含緩存、多數據源),DO 會被更廣泛地用于統一數據格式,而 PO 僅特指數據庫映射對象。

4、VO(Value Object - 值對象)

核心定位:

  • 用于表示業務層或視圖層的數據,通常用于封裝前端展示或服務間交互的 “值”,不依賴數據源。

特點:

  • 字段與業務需求或前端視圖對應,可能是多個數據源數據的組合(例如:用戶詳情頁需要的用戶名+訂單數量+積分,可能來自用戶表和訂單表)。
  • 通常是只讀的(無 setter 方法),由構造方法或工廠方法創建后不可修改。
  • 不包含業務邏輯,僅作為數據傳遞的容器。

適用場景:

  • 后端返回給前端的 JSON 數據(如 Controller 層返回的對象)。
  • 服務間調用時傳遞的業務數據(如微服務之間的接口響應)。

示例:

// 前端用戶詳情頁需要的VO
public class UserVO {private String username;  // 用戶名(來自用戶表)private int orderCount;   // 訂單數量(來自訂單表)private int積分;          // 積分(來自積分表)// 僅含getter和全參構造方法public UserVO(String username, int orderCount, int score) {this.username = username;this.orderCount = orderCount;this.score = score;}// getter方法...
}

5、POJO(Plain Old Java Object - 簡單老式Java對象)

核心定位:

  • 一個 “純” Java 對象,是所有簡單數據載體的統稱,沒有任何框架或技術的約束。

特點:

  • 僅包含私有字段、getter/setter 方法、無參構造方法(可選)。
  • 不繼承任何特定框架的類(如Serializable是允許的,因其是 JDK 自帶接口)。
  • 不實現任何框架的接口(如 MyBatis 的BaseMapper或 Spring 的Component)。
  • 不包含業務邏輯方法(如計算、校驗等)。

范圍:

  • PO、DO、DTO、VO 都可以是 POJO 的子類,只要它們符合 “無框架依賴、僅存數據” 的特征。

示例:

// 一個典型的POJO
public class User {private String name;private int age;// 無參構造、getter、setterpublic User() {}public String getName() { return name; }public void setName(String name) { this.name = name; }// age的getter/setter...
}

6、DTO(Data Transfer Object - 數據傳輸對象)

核心定位:
專門用于跨層或跨服務傳遞數據的對象,解決 “數據傳輸效率” 問題。

特點:

  • 字段根據 “傳輸需求” 定義,可能合并或裁剪數據源的字段(例如:傳輸用戶信息時,只保留id+name,隱藏password)。
  • 用于減少接口調用次數(例如:一次傳輸用戶+訂單數據,避免兩次接口調用)。
  • 可能包含序列化相關代碼(如實現Serializable),方便網絡傳輸。

適用場景:

  • 前后端數據傳輸(但此時可能與 VO 重疊,需根據團隊規范區分)。
  • 微服務之間的接口調用(如服務 A 向服務 B 傳遞數據)。

示例:

// 服務間傳輸用戶基本信息的DTO(隱藏敏感字段)
public class UserDTO implements Serializable {private Long id;private String username;// 不含password等敏感字段// getter/setter...
}

7、DAO(Data Access Object - 數據訪問對象)

在 Java 開發中,DAO(Data Access Object,數據訪問對象) 是一種設計模式,主要用于封裝對數據源(如數據庫、文件、緩存等)的訪問操作,是業務邏輯層與數據層之間的橋梁。

DAO 的核心作用:

  • 隔離數據訪問邏輯:將數據庫連接、CRUD(增刪改查)等操作封裝在 DAO 中,使業務層無需關心數據存儲的細節(如 SQL 語句、連接管理等)。
  • 統一數據訪問接口:定義標準化的方法(如save()、getById()、update()),便于維護和替換數據源(例如從 MySQL 切換到 Oracle 時,只需修改 DAO 實現,無需改動業務代碼)。

DAO 的典型組成:

  • DAO 接口:定義數據操作的抽象方法,明確 “做什么”。
  • DAO 實現類:實現接口中的方法,負責具體的數據庫操作(如編寫 SQL、管理連接、處理結果集)。
  • 實體類:通常是 PO/DO,作為數據傳輸的載體(DAO 操作的結果會封裝成實體類返回給業務層)。

示例代碼:
1、實體類(PO,與數據庫表映射):

public class UserPO {private Long id;private String username;private Integer age;// getter/setter
}

2、DAO接口(定義操作規范)

public interface UserDAO {// 新增用戶void save(UserPO user);// 根據ID查詢用戶UserPO getById(Long id);// 更新用戶信息void update(UserPO user);// 刪除用戶void delete(Long id);
}

3、DAO 實現類(具體數據訪問邏輯)

public class UserDAOImpl implements UserDAO {// 模擬數據庫連接(實際開發中會用連接池)private Connection getConnection() {// 連接數據庫的邏輯...return null;}@Overridepublic void save(UserPO user) {String sql = "INSERT INTO user (username, age) VALUES (?, ?)";// 執行SQL的邏輯(使用JDBC或MyBatis等框架)}@Overridepublic UserPO getById(Long id) {String sql = "SELECT * FROM user WHERE id = ?";// 查詢并封裝結果為UserPO返回return null;}// 其他方法實現...
}

DAO 在分層架構中的位置:
通常位于持久層,上層是業務邏輯層(Service),下層是數據源(數據庫等):

業務層(Service) → DAO → 數據源(數據庫)
  • 業務層通過調用 DAO 接口獲取數據,無需關注數據如何存儲和讀取。
  • DAO 專注于數據訪問,不包含業務邏輯(如權限校驗、事務管理通常在 Service 層處理)。

實際開發中的應用:

  • 傳統 JDBC 開發中,DAO 需手動管理連接、SQL 執行和結果集轉換。
  • 主流框架(如 MyBatis、Spring Data JPA)會簡化 DAO 的實現:
    • MyBatis 通過 Mapper 接口(本質是 DAO 接口)和 XML / 注解映射 SQL,無需手動編寫實現類。
    • Spring Data JPA 通過繼承JpaRepository接口,自動生成 CRUD 實現,進一步減少代碼量。

DAO 的核心思想是 “數據訪問與業務邏輯分離”,使系統更易維護、擴展和測試。

三、類型比較

概念全稱核心用途數據來源典型場景主要特點
DOData Object(數據對象)表示任意數據源的數據載體可來自數據庫、緩存、文件等任意數據源各層間通用的數據存儲和傳遞字段與數據源結構對應,不包含業務邏輯;概念范圍廣,PO是其特例
VOValue Object(值對象)封裝視圖層展示數據多來自業務層組裝(可能整合多個數據源)前端頁面展示、接口響應返回字段與視圖需求對應;通常只讀;可能是多源數據的組合
POPersistent Object(持久化對象)與數據庫表結構一一映射僅對應數據庫表ORM框架的數據庫CRUD操作字段與數據庫表列嚴格對應;生命周期與數據庫操作相關
BOBusiness Object(業務對象)封裝核心業務邏輯和規則來自DAO獲取的PO/DO或控制層傳遞的DTO業務流程實現、規則校驗、計算邏輯包含業務邏輯;依賴DAO或DTO;與業務領域緊密相關
DAOData Access Object(數據訪問對象)封裝對數據源的訪問操作直接操作數據源(數據庫、文件等)數據庫連接、SQL執行、結果集處理隔離數據訪問邏輯;提供標準化接口;銜接業務層與數據源
DTOData Transfer Object(數據傳輸對象)跨層/跨服務高效傳遞數據單源或多源數據的裁剪、合并前后端數據傳輸、微服務間接口調用按需定義字段(減少冗余);可能實現序列化;提高傳輸效率

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

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

相關文章

todoList清單(HTML+CSS+JavaScript)

&#x1f30f;個人博客主頁&#xff1a; 前言&#xff1a; 前段時間學習了JavaScript&#xff0c;然后寫了一個todoList小項目&#xff0c;現在和大家分享一下我的清單以及如何實現的&#xff0c;希望對大家有所幫助 &#x1f525;&#x1f525;&#x1f525;文章專題&#xff…

Mac M1探索AnythingLLM+Ollama+知識庫問答

AnythingLLM內置 RAG、AI Agent、可視化/無代碼的 Agent 編排&#xff0c;支持多家模型與本地/云端向量庫&#xff0c;并提供多用戶與可嵌入的聊天組件&#xff0c;用來快速驗證“知識 模型 工具”拼成的 AI 應用。 1 AnythingLLM、Ollama準備 1&#xff09;AnythingLLM 打…

【 Navicat Premium 17 完全圖形化新手指南(從零開始)】

Navicat Premium 17 完全圖形化新手指南&#xff08;從零開始&#xff09; 一、準備階段&#xff1a;清理現有環境 1. 刪除已創建的測試數據庫&#xff08;如需重新開始&#xff09;打開Navicat Premium 17 雙擊桌面圖標啟動程序在左側連接面板中找到你的MySQL連接&#xff08;…

Web學習筆記5

Javascript概述1、JS簡介JS是運行在瀏覽器的腳本編程語言&#xff0c;最初用于Web表單的校驗。現在的作用主要有三個&#xff1a;網頁特效、表單驗證、數據交互JS由三部分組成&#xff0c;分別是ECMAscript、DOM、BOM&#xff0c;其中ECMAscript規定了JS的基本語法和規則&#…

部署一個開源的證件照系統

以下數據來自官方網站,記錄下來,方便自己 項目簡介 &#x1f680; 謝謝你對我們的工作感興趣。您可能還想查看我們在圖像領域的其他成果&#xff0c;歡迎來信:zeyi.linswanhub.co. HivisionIDPhoto 旨在開發一種實用、系統性的證件照智能制作算法。 它利用一套完善的AI模型工作…

Linux客戶端利用MinIO對服務器數據進行同步

接上篇 Windows客戶端利用MinIO對服務器數據進行同步 本篇為Linux下 操作&#xff0c;先看下我本地的系統版本 所以我這里下載的話&#xff0c;是AMD64 文檔在這 因為我這里只是需要用到客戶端&#xff0c;獲取數據而已&#xff0c;所以我只需要下載個MC工具用來數據獲取就可以…

Docker 中部署 MySQL 5.7 并遠程連接 Navicat 的完整指南

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

自己動手造個球平衡機器人

你是否曾對那些能夠精妙地保持平衡的機器設備感到好奇&#xff1f; 從無人機到獨輪平衡車&#xff0c;背后都蘊藏著復雜的控制系統。 今天&#xff0c;我們來介紹一個充滿挑戰與樂趣的項目——制作一個球平衡機器人。這不僅是一個酷炫的擺件&#xff0c;更是一次深入學習機器…

21.Linux HTTPS服務

Linux : HTTPS服務協議傳輸方式端口安全性HTTP明文傳輸80無加密&#xff0c;可被竊聽HTTPS加密傳輸443HTTP SSL/TLS 數據加密&#xff08;防竊聽&#xff09;身份認證&#xff08;防偽裝&#xff09;完整性校驗&#xff08;防篡改&#xff09;OpenSSL 證書操作核心命令命令選項…

SqlSugar 跨方法 操作臨時表

.net項目中時長會有用到臨時表的操作結果如下所示但是在SqlSugar中可能因為會話問題導致臨時表訪問受限 搜索到的方式var conn (SqlConnection)sugarClient.Ado.Connection;if (conn.State ! System.Data.ConnectionState.Open) {conn.Open();}using (var cmd new SqlCommand…

怎么用飛算javaAI實現視頻逐幀截圖并保存

相信很多朋友都遇到過這樣的需求&#xff1a;想從視頻中截取特定幀作為素材&#xff0c;卻苦于沒有簡單易用的工具&#xff0c;要么操作復雜難以精準定位&#xff0c;要么導出的圖片質量不佳。市面上的視頻處理軟件要么功能冗余&#xff0c;要么需要付費才能使用逐幀截取功能&a…

【2】Transformers快速入門:統計語言模型是啥?

一句話看懂統計語言模型核心任務&#xff1a;教電腦判斷一句話 “像不像人話” &#xff08;比如“我愛吃蘋果”? vs “蘋果吃愛我”?&#xff09;1. 早期&#xff1a;死磕語法規則 → 失敗&#xff01; 科學家思路&#xff08;1970年前&#xff09;&#xff1a; 像語文老師一…

[激光原理與應用-230]:物理學主要分支、研究對象、衍生技術及職業方向解析

物理學作為自然科學的核心學科&#xff0c;其分支體系覆蓋從微觀粒子到宏觀宇宙的廣闊領域&#xff0c;并通過交叉融合衍生出眾多前沿技術。以下從經典與現代物理學分支、交叉學科、技術轉化及職業方向四個維度展開分析&#xff1a;一、經典物理學分支&#xff1a;宏觀世界的基…

北京JAVA基礎面試30天打卡08

RocketMQ、RabbitMQ與Kafka對比及常見問題解決方案 一、概述 消息隊列&#xff08;Message Queue, MQ&#xff09;是企業IT系統內部通信的核心手段&#xff0c;用于提升性能、實現系統解耦和流量削峰。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等功能&#xff0c;是…

【CSS 變量】讓你的 CSS “活”起來:深入理解 CSS 自定義屬性與主題切換

【CSS 變量】讓你的 CSS “活”起來&#xff1a;深入理解 CSS 自定義屬性與主題切換 所屬專欄&#xff1a; 《前端小技巧集合&#xff1a;讓你的代碼更優雅高效》 上一篇&#xff1a; 【CSS 視覺】無需JS&#xff0c;純 CSS 實現酷炫視覺效果&#xff08;clip-path, filter, b…

RAG初步實戰:從 PDF 到問答:我的第一個輕量級 RAG 系統(附詳細項目代碼內容與說明)

RAG初步實戰&#xff1a;從 PDF 到問答&#xff1a;我的第一個輕量級 RAG 系統 項目背景與目標 在大模型逐漸普及的今天&#xff0c;Retrieval-Augmented Generation&#xff08;RAG&#xff0c;檢索增強生成&#xff09;作為連接“知識庫”和“大語言模型”的核心范式&#…

自主泊車算法

看我的git 在 open space 空間下規劃出?條??到停?位的?碰撞軌跡 滿?平滑約束 可跟蹤 考慮動態障礙物約束 在路徑不可?的情況下 具備重規劃能? 重規劃時能夠做到?縫切換 即從原路徑?縫切換到重規劃路徑 ?明顯體感 規劃頻率 10HZ

USB 2.0 學習(2)- 連接

上回說到 usb的信號 k 狀態和 j 狀態&#xff0c;補充一下 usb的一些電氣小知識。 1.USB設備有四根線 電源線VBus、 D、 D-、 地線GND 2.USB主機端的 D 和 D-各有1個15k下拉電阻&#xff0c;這是為了準確檢測 D還是D-線上電平的變化 因為USB總線檢測USB設備是低速還是全速設備…

解鎖 Appium Inspector:移動端 UI 自動化定位的利器

? 在移動端 UI 自動化測試中&#xff0c;元素定位是繞不開的核心環節。無論是 Android 還是 iOS 應用&#xff0c;能否精準、高效地定位到界面元素&#xff0c;直接決定了自動化腳本的穩定性和可維護性。而 Appium Inspector 作為 Appium 生態中專門用于元素定位的工具&#…

機器學習概念1

了解機器學習1、什么是機器學習機器學習是一門通過編程讓計算機從數據中進行學習的科學 通用定義&#xff1a;機器學習是一個研究領域讓計算機無須進行明確編程就具備學習能力 工程化定義&#xff1a;一個計算機程序利用經驗E來學習任務T&#xff0c;性能是P&#xff0c;如果針…