dto 是只給前端需要的數據嗎_DO、VO、DTO...XXOO,你弄明白了么

技術公眾號:Java In Mind(Java_In_Mind),歡迎關注!

背景

我相信,剛開始學習接觸企業代碼的時候,一定會發現,工程中充斥著各種XO:DO、VO、DTO、DAO,還有各種名詞:POJO,JavaBean,Domain等等,這些貌似看起來都一樣,又好像用在不同的地方,記得之前一個前端同事調侃說:“我不想學Java,各種OOO,腦殼疼!”,這里結合自己的理解對這幾個名詞做些介紹。

何為POJO

POJO(Plain Ordinary Java Object),即簡單Java對象,就是一個我們最常見的普通Java對象,這個概念是被大家叫出來的,它具有一些屬性,然后提供對應的getter和setter,如下:

public class Foo {

private String name;

private String type;

public String getName(){

return this.name;

}

public void setName(String name){

this.name = name;

}

public String getType(){

return this.Type;

}

public void setType(String type){

this.type = type;

}

}

何為JavaBean

JavaBean,可序列化的POJO,sun在早期有對其規范(JavaBeans Spec),它是Java中的可重用組件,主要規范約定如下:JavaBean為公共類,并且具有一個空構造函數

所有屬性為私有屬性,提供getter和setter,不應該有公共屬性

實現序列化接口:java.io.Serializable

JavaBean已經成為Java的一種規范,也是Java社區的共同語言,許多工具框架也是遵循JavaBean的規范的,例如,Spring的BeanUtils,一些Json工具都是基于JavaBean的規范來實現的,這些都是基于約定,所以也有人把JavaBean叫為可以持久化的POJO。

何為DO

DO(Domain Object),領域對象,也就是ORM框架中對應數據庫的對象,業務實體,例如,對現實世界中的用戶建模,抽象出來的DO可以叫為UserDO,通常情況下它用于與數據庫的數據交互,通常也是一個JavaBean。

何為PO

PO(Persistent Object),持久化對象,主要用于持久化層,與數據庫對應,通常也是ORM框架中的實體對象,例如,使用JPA時候的Entity與數據庫表做映射,通常是一個JavaBean。

何為DTO

DTO(Data Transfer Object),數據傳輸對象,顧名思義就是用于傳輸數據的對象,通常用于處于不同架構層次或者不同子系統之間的數據傳遞,或者用于外部接口參數傳遞,以便提供不同粒度不同信息的數據,以免造成困惑干擾,通常也是一個JavaBean。

何為VO

VO(Value Object),就是用于保存數據的對象;在提供給頁面使用的時候,也有人解釋為View Object,就是對應頁面展示數據的對象。

何為DAO

DAO(Data Access Object),數據訪問對象,與數據庫做交互的對象,提供不同的接口訪問數據庫來實現對數據庫的操作,而接口使用的數據交互通常就是PO或者DO,通過它可以使用面向對象的方式來與數據庫交互。

總結DO、PO、VO、DTO等其實都是一個JavaBean,只是應用的范圍不同,表示的意義不同,而這些不同是Java這么多年來形成的一種約定,這種習慣形成Java程序員之間一種共識

DO和PO大部分時間是一樣的,不過PO更傾向于有狀態的對象,例如,使用Hibernate的時候,通過DAO操作過的對象會被框架所持有,如果一旦對其操作,在Session關閉的時候會寫回數據庫,這個時候使用PO就要非常小心,特別是與其他業務層交互的時候,最好轉成DTO或者VO提供數據,不能把持久化對象暴露出去,不然可能會導致數據被修改

在使用這類對象的時候,我們還是要明白其意義,然后在合適的場景使用,畢竟這是Java形成的通用語言,想要讀懂他人代碼就要理解,想要他人能讀懂自己的代碼就要遵循

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

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

相關文章

Javascript判斷object還是list/array的類型(包含javascript的數據類型研究)

前提:先研究javascript中的變量有幾種,參考: http://www.w3school.com.cn/js/js_datatypes.asp http://glzaction.iteye.com/blog/1285147 測試1: typeof關鍵字 var obj {test:test}; typeof obj;//輸出object var list [{test:t…

Core Data

簡介 Core Data是iOS5之后才出現的一個框架,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。在此數據操作期間,我們不需要編寫任何…

tbase同步mysql_mysql主從同步

MySQL主從介紹MySQL主從叫做Replication、AB復制,A和B做主從后,在A上寫數據。B上也會同步A的數據,兩者實現實時同步MySQL是基于binlog日志來同步的,主上必須開啟binlog才能進行主從同步,同步過程大概有三個步驟(1)主將…

2017將轉行進行到底

2016 年說著轉行,最后還是在匆匆中找了一份老本行,此刻的心情還是無愛,畢竟螺絲一直分不清啊,不喜歡就是不喜歡。看了django的教程,不得不感嘆國外的書寫的相對優秀一點,《learning django web development…

mysql中函數是否可以返回多個值_是否可以從mysql函數返回多個值?

我的臟解決方案是:1.連接字符串中的值. 2返回字符串. 3 Splits將字符串返回值.我認為它不優雅,我確信這有局限性,但它適用于簡單的情況還有必要創建分裂函數,因為Mysql沒有這個函數:首先編輯你的功能.CREATE FUNCTION yourFunctionWith2valuesForReturni…

lua自定義迭代器

迭代器 http://www.tutorialspoint.com/lua/lua_iterators.htm 迭代器能夠讓你遍歷某個集合或者容器中的每一個元素。 對于lua來說, 集合通常指代 table, 用于創建變化的數據結構, 類似數組。 Iterator is a construct that enables you to t…

mysql非主鍵索引_主鍵索引和非主鍵索引的區別

1. 什么是最左前綴原則?以下回答全部是基于MySQL的InnoDB引擎例如對于下面這一張表如果我們按照 name 字段來建立索引的話,采用B樹的結構,大概的索引結構如下如果我們要進行模糊查找,查找name 以“張"開頭的所有人的ID&#…

優美的配色方案設計

2019獨角獸企業重金招聘Python工程師標準>>> 怎么做好設計配色一直是個難題,雖然網站上有各種各樣的色庫,但配色仍然至關重要,不得已的話可以親自動手,況且樂趣滿滿。 這個沒有一套標準,所以看自己怎么喜歡…

It's a start!

開始博客之旅轉載于:https://www.cnblogs.com/catchingdream/p/5843172.html

mysql死鎖釋放時間參數_【Mysql】mysql 事務未提交導致死鎖 Lock wait timeout exceeded; try restarting transaction 解決辦法...

問題場景問題出現環境:1、在同一事務內先后對同一條數據進行插入和更新操作;2、多臺服務器操作同一數據庫;3、瞬時出現高并發現象;不斷的有一下異常拋出,異常信息:org.springframework.dao.CannotAcquireLo…

ORACLE sqlplus設置行數和寬度

1) 查看目前的pagesize,默認是14:Sqlplus代碼show pagesize; 2) 將pagesize設置好100,則可以一次顯示夠多行記錄了:Sqlplus代碼set pagesize 100; 2. 設置行的寬度1) 查看目前的linesize,默認是80:Sqlplus代碼show linesize; 2) 設置成100或者更寬都可以:Sqlplus代碼set li…

mysql關系模式怎么畫_關系數據庫與mysql

表下面是阿里的mysql設計原則,可以參考,不一定按照阿里規則,但一個團隊一定要有規則,如果現在沒有規則,從現在開始,慢慢推廣,適應1.【強制】表達是與否概念的字段,必須使用 is_xxx的…

Javascript 構造函數模式、原型模式

前兩天寫完組合繼承,打算總結一下原型繼承的,不過今天看了一下工廠模式、構造函數模式和原型模式,覺得有必要總結一下以加深印象。 ———————————————————————————————————————————————————…

2016年CCF第七次測試 俄羅斯方塊

1 //2016年CCF第七次測試 俄羅斯方塊2 // 這道小模擬題還是不錯3 // 思路&#xff1a;處理出輸入矩陣中含1格子的行數和列數4 // 再判是否有一個格子碰到底部&#xff0c;否則整體再往下移動一步&#xff0c;如果有一個格子不能移動&#xff0c;要返回到前一步5 6 #include <…

springmvc視圖解析器_SpringMVC視圖及REST風格

什么是視圖解析器&#xff1f;springMVC用于處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的視圖名稱解析成一個真的的視圖&#xff0c;而SpringMVC中用于把View對象呈現給客戶端的是View對象本身&#xff0c;而ViewResolver只是把邏輯…

mysql5.7.x 1251_MySql-8.0.x免安裝版下載與配置,Navicat打開數據庫鏈接報錯1251的解決辦法...

概述MySQL從5.7一下子跳到了MySQL8.0, 其中的變化必然是很大的, 這里就不說了, 本文主要講解最新版MySQL安裝的事情.實際上5.7版本后的mysql免安裝版都是沒有data文件和my.ini文件的&#xff0c;下面再具體說明怎么生成&#xff0c;注意不能自己手動新建.下載下載程序必然去官網…

To install 64-bit ODBC drivers

為了更充分的利用硬件資源&#xff0c;我想很多人都開使用64位操作系統了&#xff0c;同時你可以也發現了在64位操作系統上ODBC的驅動找不到了&#xff0c;所以ODBC的東西都沒法用了。 因為2007以前版本的Office只有32位版本&#xff0c;所以我們不能在64位系統上使用ODBC。使用…

【Qt開發】QTableWidget設置根據內容調整列寬和行高

QTableWidget要調整表格行寬主要涉及以下一個函數 1.resizeColumnsToContents(); 根據內容調整列寬 2.resizeColumnToContents(int col); 根據內容自動調整給定列寬 3.horizontalHeader()->setResizeMode 把給定列…

深入淺出mysql數據開發_深入淺出MySQL數據庫開發、優化與管理維護 PDF掃描版[513KB]...

深入淺出MySQL數據庫開發、優化與管理維護 內容介紹&#xff1a;本書從數據庫的基礎、開發、優化、管理維護4個方面對MySQL進行了詳細的介紹&#xff0c;其中每一部分都獨立成篇。本書內容實用&#xff0c;覆蓋廣泛&#xff0c;講解由淺入深&#xff0c;適合于各個層次的讀者。…

Understand Lambda Expressions in 3 minutes(翻譯)

本文翻譯自CodeProject上的一篇簡單解釋Lambda表達式的文章&#xff0c;適合新手理解。譯文后面我補充了一點對Lambda表達式的說明。 1.什么是Lambda表達式&#xff1f; Lambda表達式是一種匿名方法&#xff0c;多數情況下用來在LINQ中快速創建委托。簡單地說&#xff0c;它代表…