首頁 > 軟體

java中VO和DTO之間的轉換實現

2022-05-15 16:00:29

一、背景

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之間的轉換實現的文章就介紹到這了,更多相關java VO和DTO轉換 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com