Dozer 是一個 Java Bean 到 Java Bean 的映射器,它遞歸地將資料從一個物件複製到另一個物件。 Dozer 是用來對兩個物件之間屬性轉換的工具,有了這個工具之後,我們將一個物件的所有屬性值轉給另一個物件時,就不需要再寫重複的呼叫 set 和 get 方法。
最重要的是,Dozer 可以確保來自資料庫的內部域物件不會滲入外部表示層或外部消費者,它還可以將網域物件對應到外部 API 呼叫,反之亦然。
映射框架在分層架構中作用很大,我們可以透過封裝對特定資料物件的變更與將這些物件傳播到其他圖層(即外部服務資料物件、網域物件、資料傳輸物件、內部服務資料物件)來建立抽象層。映射框架非常適合在負責將資料從一個資料物件映射到另一個資料物件的 Mapper 類型類別中使用。
對於分散式系統架構而言,副作用是域物件在不同系統之間的傳遞。那麼,我們不希望內部域物件暴露在外部,也不允許外部域物件滲入我們的系統。
資料物件之間的映射傳統上是透過在物件之間複製資料的手動編碼值物件組裝器(或轉換器)來解決的。 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映射框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!