一、背景
1.領域模型中的實體類別分為四種:VO、DTO、DO、PO
# #二、詳細講解
1.VO(View Object),視圖對象,用來展示層,它的作用是把某個指定頁面(或元件)的所有資料封裝起來。
2.DTO(Data Transfer Object),資料傳輸對象,這個概念來自於J2EE的設計模式,原來的目的是為了EJB的分散式應用提供粗粒度的資料實體,以減少分散式調用的次數,從而提高分散式呼叫的效能和降低網路負載,但在這裡,我泛指用於展示層與服務層之間的資料傳輸物件。
3.DO(Domain Object),領域對象,就是從現實世界中抽像出來的有形或無形的業務實體。
4.PO(PersistentObject),持久化對象,它跟持久層(通常是關係型資料庫)的資料結構形成一一對應的映射關係,如果持久層是關係型資料庫,那麼,數據表中的每個欄位(或若干個)就對應PO的一個(或若干個)屬性。
5.範例:
後端傳回個前端的對象,可以***VO.java
mybatis產生的dao表實體對象,可以**** PO.java
一般是PO 轉換DO 然後轉換DTO提供服務供外部呼叫
注意
PO一般自動生成和表格字段一一映射
DO一般和DO很多字段是一樣帶,但很多如類型字段是枚舉,有的項目中DO是Model結尾的類
DTO如webservice接口(提供外部服務的),返回結果對象都是DTO,裡面屬性的定義比較講究,易懂安全好擴展,DTO與DTO之間關係是包含還是平級,設計的時候一定要定義清楚,不然後期就是個坑
VO比較簡單,前端展示需要什麼就怎麼定義
三、實體物件間的轉換
一個規範的專案
程式碼中充滿了VO、From、DTO、DO等等pojo類,這些類作用不一樣但類裡面的屬性值往往一模一樣,當屬性非常多時,一個個set的確非常累人又耗時時間,其實強大的Spring早為我們準備好了貼心工具,一行以前搞定甚至30行的程式碼量
四、第一種方法的具體程式碼範例
1.導入依賴
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.6.RELEASE</version> </dependency>
2.一個DTO(介面定義物件一般用DTO )
public class TestDemoDTO{ private String name; private Map<String,String> citys; private Date gmtStart; private Boolean flag; private Integer age; private List<String> types; public String getName() { return name; } public void setName(String name) { this.name = name; } public Map<String, String> getCitys() { return citys; } public void setCitys(Map<String, String> citys) { this.citys = citys; } public Date getGmtStart() { return gmtStart; } public void setGmtStart(Date gmtStart) { this.gmtStart = gmtStart; } public Boolean getFlag() { return flag; } public void setFlag(Boolean flag) { this.flag = flag; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List<String> getTypes() { return types; } public void setTypes(List<String> types) { this.types = types; } @Override public String toString() { return "TestDemoDTO{" + "name='" + name + '\'' + ", citys=" + citys + ", gmtStart=" + gmtStart + ", flag=" + flag + ", age=" + age + ", types=" + types + '}'; } }
3.一個From(前端入參定義From)
public class TestDemoFrom { private String name; private Map<String,String> citys; private Date gmtStart; private Boolean flag; private Integer age; private List<String> types; public String getName() { return name; } public void setName(String name) { this.name = name; } public Map<String, String> getCitys() { return citys; } public void setCitys(Map<String, String> citys) { this.citys = citys; } public Date getGmtStart() { return gmtStart; } public void setGmtStart(Date gmtStart) { this.gmtStart = gmtStart; } public Boolean getFlag() { return flag; } public void setFlag(Boolean flag) { this.flag = flag; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List<String> getTypes() { return types; } public void setTypes(List<String> types) { this.types = types; } @Override public String toString() { return "TestDemoFrom{" + "name='" + name + '\'' + ", citys=" + citys + ", gmtStart=" + gmtStart + ", flag=" + flag + ", age=" + age + ", types=" + types + '}'; } }
4.測試類別
public class TestDemo { public static void main(String[] args) { TestDemoFrom testDemoFrom = new TestDemoFrom(); HashMap<String, String> map = Maps.newHashMap(); map.put("001","北京"); map.put("002","上海"); map.put("003","广州"); testDemoFrom.setCitys(map); testDemoFrom.setFlag(true); testDemoFrom.setGmtStart(new Date()); testDemoFrom.setName("诺言"); testDemoFrom.setAge(18); testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝")); System.out.printf(testDemoFrom.toString()+"\n"); //下面就可以开始转化了,就一行代码 TestDemoDTO testDemoDTO = new TestDemoDTO(); BeanUtils.copyProperties(testDemoFrom,testDemoDTO); System.out.println(testDemoDTO.toString()); } }
5.結果
TestDemoFrom {name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18, types=[我愛,寶貝]}
TestDemoDTO{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18 , types=[我愛, 寶貝]}
6.注意
#注意賦值失敗狀況
如果屬性名稱不同就會賦值不了
如果型別不同,名稱相同也是會賦值不了
五、第二種方法的具體程式碼範例(使用dozer)
1.導入依賴
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.4.0</version> </dependency>
2.測試類別
public class TestDemoDozer { @Test public void test() { DozerBeanMapper mapper = new DozerBeanMapper(); TestDemoFrom testDemoFrom = new TestDemoFrom(); HashMap<String, String> map = Maps.newHashMap(); map.put("001","北京"); map.put("002","上海"); map.put("003","广州"); testDemoFrom.setCitys(map); testDemoFrom.setFlag(true); testDemoFrom.setGmtStart(new Date()); testDemoFrom.setName("诺言"); testDemoFrom.setAge(18); testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝")); System.out.printf(testDemoFrom.toString()+"\n"); // 转换 TestDemoDTO convert = mapper.map(testDemoFrom,TestDemoDTO.class); System.out.println(convert); } }
3.結果
#TestDemoFrom{name='承諾', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我愛, 寶貝]}
TestDemoDTO{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我愛, 寶貝]}
以上是java中VO和DTO之間的轉換怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具