SpringBoot整合Dozer映射框架流程詳解

 更新時間:2022年07月06日 10:06:08   作者:華仔仔coding  
dozer是用來兩個對象之間屬性轉換的工具,有了這個工具之后,我們將一個對象的所有屬性值轉給另一個對象時,就不需要再去寫重復的set和get方法了,下面介紹下SpringBoot中Dozer的使用,感興趣的朋友一起看看吧

1. Dozer 介紹

Dozer 是一個 Java Bean 到 Java Bean 的映射器,它遞歸地將數據從一個對象復制到另一個對象。Dozer 是用來對兩個對象之間屬性轉換的工具,有了這個工具之后,我們將一個對象的所有屬性值轉給另一個對象時,就不需要再去寫重復的調用 set 和 get 方法。

最重要的是,Dozer 可以確保來自數據庫的內部域對象不會滲入外部表示層或外部消費者,它還可以將域對象映射到外部 API 調用,反之亦然。

2. 為什么要使用映射框架 Dozer

映射框架在分層架構中作用很大,我們可以通過封裝對特定數據對象的更改與將這些對象傳播到其他層(即外部服務數據對象、域對象、數據傳輸對象、內部服務數據對象)來創建抽象層。 映射框架非常適合在負責將數據從一個數據對象映射到另一個數據對象的 Mapper 類型類中使用。

對于分布式系統架構而言,副作用是域對象在不同系統之間的傳遞。那么,我們不希望內部域對象暴露在外部,也不允許外部域對象滲入我們的系統。

數據對象之間的映射傳統上是通過在對象之間復制數據的手動編碼值對象組裝器(或轉換器)來解決的。Dozer 作為一個強大、通用、靈活、可重用和可配置的開源映射框架,節省了開發人員開發某種自定義映射器框架帶來的時間成本。

3. Dozer 映射框架的使用

Dozer 的 maven 坐標:

<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-core</artifactId>
    <version>6.5.0</version>
</dependency>

為了簡化使用方式,Dozer 還提供了 starter,其 maven 坐標為:

<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-spring-boot-starter</artifactId>
    <version>6.5.0</version>
</dependency>

下面就開始著手在 springboot 項目中使用 dozer 映射框架。工程的目錄結構如下圖所示:

第一步,創建 maven 工程 dozer_demo 并配置 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hzz</groupId>
    <artifactId>dozer_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.github.dozermapper</groupId>
            <artifactId>dozer-spring-boot-starter</artifactId>
            <version>6.5.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

第二步,創建 UserDTO 和 UserEntity

UserDTO 類

package com.hzz.dto;
import lombok.Data;
@Data
public class UserDTO {
    private String userId;
    private String userName;
    private int userAge;
    private String address;
    private String birthday;
}

UserEntity 類

package com.hzz.entity;
import lombok.Data;
import java.util.Date;
@Data
public class UserEntity {
    private String id;
    private String name;
    private int age;
    private String address;
    private Date birthday;
}

第三步,在 resources/dozer/ 目錄下創建 dozer 的全局配置文件 global.dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                              http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!--全局配置:<date-format>表示日期格式-->
    <configuration>
        <date-format>yyyy-MM-dd</date-format>
    </configuration>
</mappings>

第四步,在 resources/dozer/ 目錄下創建 dozer 的映射文件 biz.dozer.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                             http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!--描述兩個類中屬性的對應關系,對于兩個類中同名的屬性可以不映射-->
    <mapping date-format="yyyy-MM-dd">
        <class-a>com.hzz.entity.UserEntity</class-a>
        <class-b>com.hzz.dto.UserDTO</class-b>
        <field>
            <a>id</a>
            <b>userId</b>
        </field>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>age</a>
            <b>userAge</b>
        </field>
    </mapping>
    <!--
    可以使用 map-id 指定映射的標識,在程序中通過此標識來確定使用當前這個映射關系
    -->
    <mapping date-format="yyyy-MM-dd" map-id="user">
        <class-a>com.hzz.entity.UserEntity</class-a>
        <class-b>com.hzz.dto.UserDTO</class-b>
        <field>
            <a>id</a>
            <b>userId</b>
        </field>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>age</a>
            <b>userAge</b>
        </field>
    </mapping>
</mappings>

第五步,編寫 application.yml 文件

dozer:
  mappingFiles:
    - classpath:dozer/global.dozer.xml
    - classpath:dozer/biz.dozer.xml

第六步,創建主啟動類 DozerApp

package com.hzz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DozerApp {
    public static void main(String[] args) {
        SpringApplication.run(DozerApp.class, args);
    }
}

第七步,編寫單元測試 DozerTest

package com.hzz;
import com.github.dozermapper.core.Mapper;
import com.hzz.dto.UserDTO;
import com.hzz.entity.UserEntity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DozerApp.class)
public class DozerTest {
    @Autowired
    private Mapper mapper;
    @Test
    public void testDozer() {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("ls");
        userDTO.setUserAge(2);
        userDTO.setAddress("bj");
        userDTO.setBirthday("2020-07-04");
        UserEntity user = mapper.map(userDTO, UserEntity.class);
        System.out.println(user);
    }
    @Test
    public void testDozer2(){
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("ls");
        userDTO.setUserAge(5);
        userDTO.setAddress("bj");
        userDTO.setBirthday("2017-07-04");
        UserEntity user = new UserEntity();
        user.setId("200");
        System.out.println(user);
        mapper.map(userDTO, user);
        System.out.println(user); //被 userDTO 覆蓋了
    }
    @Test
    public void testDozer3(){
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("zs");
        userDTO.setUserAge(3);
        userDTO.setAddress("bj");
        UserEntity user = new UserEntity();
        System.out.println(user);
        mapper.map(userDTO,user,"user"); //指定映射ID為user
        System.out.println(user);
    }
}

到此這篇關于SpringBoot整合Dozer映射框架流程詳解的文章就介紹到這了,更多相關SpringBoot Dozer映射框架內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java編程實現獲取服務器IP地址及MAC地址的方法

    java編程實現獲取服務器IP地址及MAC地址的方法

    這篇文章主要介紹了java編程實現獲取機器IP地址及MAC地址的方法,實例分析了Java分別針對單網卡及多網卡的情況下獲取服務器IP地址與MAC地址的相關技巧,需要的朋友可以參考下
    2015-11-11
  • 如何測試Java類的線程安全性

    如何測試Java類的線程安全性

    這篇文章主要介紹了如何測試Java類的線程安全性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 簡介Java的Hibernate框架中的Session和持久化類

    簡介Java的Hibernate框架中的Session和持久化類

    這篇文章主要介紹了Java的Hibernate框架中的Session和持久化類,Hibernate是Java的SSH三大web開發框架之一,需要的朋友可以參考下
    2015-12-12
  • SpringBoot整合Ehcache3的實現步驟

    SpringBoot整合Ehcache3的實現步驟

    本文主要介紹了SpringBoot整合Ehcache3的實現步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java序列化和java反序列化示例

    java序列化和java反序列化示例

    在web項目開發的時候,經常用到序列化和反序列化用來傳遞大流量的數據,類只有實現Serializable借口才能被序列化,下來是java序列化和反序列化演示
    2014-01-01
  • 利用Java簡單實現一個代碼行數統計器方法實例

    利用Java簡單實現一個代碼行數統計器方法實例

    這篇文章主要給大家介紹了關于如何利用Java簡單實現一個代碼行數統計器的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • springboot+Oauth2實現自定義AuthenticationManager和認證path

    springboot+Oauth2實現自定義AuthenticationManager和認證path

    本篇文章主要介紹了springboot+Oauth2實現自定義AuthenticationManager和認證path,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 深入理解Java中觀察者模式與委托的對比

    深入理解Java中觀察者模式與委托的對比

    這篇文章主要介紹了Java中觀察者模式與委托的對比,觀察者模式:定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,委托的實現簡單來講就是用反射來實現的,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • @JsonSerialize不起作用的解決方案

    @JsonSerialize不起作用的解決方案

    這篇文章主要介紹了@JsonSerialize不起作用的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • @PathVariable 如何自動填充入實例對象中

    @PathVariable 如何自動填充入實例對象中

    這篇文章主要介紹了@PathVariable 實現自動填充入實例對象中的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

美丽人妻被按摩中出中文字幕