" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中VO和DTO之間的轉(zhuǎn)換實(shí)現(xiàn)

 更新時(shí)間:2022年05月15日 11:47:46   作者:mingxu.chen  
本文主要介紹了java中VO和DTO之間的轉(zhuǎn)換實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、背景

1.領(lǐng)域模型中的實(shí)體類(lèi)分為四種類(lèi)型:VO、DTO、DO、PO

二、詳細(xì)講解

1.VO(View Object),視圖對(duì)象,用于展示層,它的作用是把某個(gè)指定頁(yè)面(或組件)的所有數(shù)據(jù)封裝起來(lái)。

2.DTO(Data Transfer Object),數(shù)據(jù)傳輸對(duì)象,這個(gè)概念來(lái)源于J2EE的設(shè)計(jì)模式,原來(lái)的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象。

3.DO(Domain Object),領(lǐng)域?qū)ο?,就是從現(xiàn)實(shí)世界中抽象出來(lái)的有形或無(wú)形的業(yè)務(wù)實(shí)體。

4.PO(PersistentObject),持久化對(duì)象,它跟持久層(通常是關(guān)系型數(shù)據(jù)庫(kù))的數(shù)據(jù)結(jié)構(gòu)形成一一對(duì)應(yīng)的映射關(guān)系,如果持久層是關(guān)系型數(shù)據(jù)庫(kù),那么,數(shù)據(jù)表中的每個(gè)字段(或若干個(gè))就對(duì)應(yīng)PO的一個(gè)(或若干個(gè))屬性。

5.舉例:

后端返回個(gè)前端的對(duì)象,可以 ***VO.java

mybatis生成的dao表實(shí)體對(duì)象,可以 ****PO.java

一般是 PO 轉(zhuǎn)換 DO 然后 轉(zhuǎn)換 DTO提供服務(wù)供外部調(diào)用

注意

PO一般自動(dòng)生成和表字段一一映射

DO一般和DO很多字段是一樣帶,但很多如類(lèi)型字段是枚舉,有的項(xiàng)目中DO是Model結(jié)尾的類(lèi)

DTO如webservice接口(提供外部服務(wù)的),返回結(jié)果對(duì)象都是DTO,里面屬性的定義比較講究,易懂安全好擴(kuò)展,DTO與DTO之間關(guān)系是包含還是平級(jí),設(shè)計(jì)的時(shí)候一定要定義清楚,不然后期就是個(gè)坑

VO比較簡(jiǎn)單,前端展示需要什么就怎么定義

三、實(shí)體對(duì)象間的轉(zhuǎn)換

一個(gè)規(guī)范的項(xiàng)目

代碼中充滿(mǎn)了VO、From、DTO、DO等等pojo類(lèi),這些類(lèi)作用不一樣但類(lèi)里面的屬性值往往一模一樣,當(dāng)屬性非常多時(shí),一個(gè)個(gè)set的確非常累人又耗時(shí)間,其實(shí)強(qiáng)大的Spring早為我們準(zhǔn)備好了貼心工具,一行搞定以前甚至30行的代碼量

四、第一種方法的具體代碼例子

1.導(dǎo)入依賴(lài)

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>5.1.6.RELEASE</version>
</dependency>

2.一個(gè)DTO(接口定義對(duì)象一般用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.一個(gè)From(前端入?yún)⒍xFrom)

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.測(cè)試類(lèi)

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("我愛(ài)","寶貝"));
        System.out.printf(testDemoFrom.toString()+"\n");
        //下面就可以開(kāi)始轉(zhuǎn)化了,就一行代碼
        TestDemoDTO testDemoDTO = new TestDemoDTO();
        BeanUtils.copyProperties(testDemoFrom,testDemoDTO);
 
        System.out.println(testDemoDTO.toString());
    }
}

5.結(jié)果

TestDemoFrom{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18, types=[我愛(ài), 寶貝]}
TestDemoDTO{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18, types=[我愛(ài), 寶貝]}

6.注意

注意賦值失敗情況
如果屬性名稱(chēng)不同就會(huì)賦值不了
如果類(lèi)型不同,名稱(chēng)相同也是會(huì)賦值不了

五、第二種方法的具體代碼例子(使用dozer)

1.導(dǎo)入依賴(lài)

<dependency>
  <groupId>net.sf.dozer</groupId>
  <artifactId>dozer</artifactId>
  <version>5.4.0</version>
</dependency>

2.測(cè)試類(lèi)

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("我愛(ài)","寶貝"));
        System.out.printf(testDemoFrom.toString()+"\n");
        // 轉(zhuǎn)換
        TestDemoDTO convert = mapper.map(testDemoFrom,TestDemoDTO.class);
        System.out.println(convert);
    }
    
}

3.結(jié)果

 TestDemoFrom{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我愛(ài), 寶貝]}
TestDemoDTO{name='諾言', citys={001=北京, 002=上海, 003=廣州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我愛(ài), 寶貝]}

六、結(jié)束

到此這篇關(guān)于java中VO和DTO之間的轉(zhuǎn)換實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java VO和DTO轉(zhuǎn)換 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Netty分布式ByteBuf緩沖區(qū)分配器源碼解析

    Netty分布式ByteBuf緩沖區(qū)分配器源碼解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf緩沖區(qū)分配器源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • AQS同步組件Semaphore信號(hào)量案例剖析

    AQS同步組件Semaphore信號(hào)量案例剖析

    這篇文章主要為大家介紹了AQS同步組件Semaphore信號(hào)量案例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Flowable數(shù)據(jù)庫(kù)表分類(lèi)及數(shù)據(jù)字典解析

    Flowable數(shù)據(jù)庫(kù)表分類(lèi)及數(shù)據(jù)字典解析

    這篇文章主要介紹了Flowable數(shù)據(jù)庫(kù)表分類(lèi)及數(shù)據(jù)字典解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot集成JPA全指南

    SpringBoot集成JPA全指南

    在Java Web開(kāi)發(fā)中,數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)是繞不開(kāi)的話(huà)題,傳統(tǒng)方式使用JDBC編寫(xiě)SQL,維護(hù)困難、可讀性差,后來(lái)有了MyBatis這種半自動(dòng)ORM框架,再到JPA這種全自動(dòng)ORM規(guī)范,SpringBoot對(duì)JPA提供了非常友好的自動(dòng)化支持,本文給大家介紹了SpringBoot集成JPA全指南
    2025-08-08
  • 如何使用mybatis-generator自動(dòng)生成代碼

    如何使用mybatis-generator自動(dòng)生成代碼

    這篇文章主要介紹了如何使用mybatis-generator自動(dòng)生成代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    java中List去除重復(fù)數(shù)據(jù)的5種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于java中List去除重復(fù)數(shù)據(jù)的5種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java if-else 多重嵌套的優(yōu)化方式

    Java if-else 多重嵌套的優(yōu)化方式

    這篇文章主要介紹了Java if-else 多重嵌套的優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • spring 注解驗(yàn)證@NotNull等使用方法

    spring 注解驗(yàn)證@NotNull等使用方法

    這篇文章主要介紹了spring 注解驗(yàn)證@NotNull等使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java中操作Word修訂功能的示例詳解

    Java中操作Word修訂功能的示例詳解

    Word的修訂功能是一種在文檔中進(jìn)行編輯和審閱的功能,它允許多個(gè)用戶(hù)對(duì)同一文檔進(jìn)行修改并跟蹤這些修改,以便進(jìn)行審查和接受或拒絕修改,下面我們就來(lái)學(xué)習(xí)一下Java中操作Word修訂功能的方法,需要的可以參考下
    2023-12-12
  • Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼

    Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼

    本篇文章主要介紹了Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08

最新評(píng)論

讷河市| 公主岭市| 嘉定区| 庆安县| 曲麻莱县| 新乡县| 新和县| 泊头市| 临邑县| 增城市| 蒙山县| 瓮安县| 平塘县| 玛多县| 肇州县| 义马市| 南通市| 大丰市| 扬州市| 宁武县| 五原县| 城固县| 仁怀市| 蓬莱市| 垦利县| 奉化市| 新乐市| 南江县| 乐清市| 仲巴县| 永福县| 松阳县| 灵台县| 遵义县| 故城县| 达孜县| 明光市| 中超| 新和县| 漳平市| 扎赉特旗|