SpringBoot整合Dozer映射框架流程詳解
1. Dozer 介紹
Dozer 是一個(gè) Java Bean 到 Java Bean 的映射器,它遞歸地將數(shù)據(jù)從一個(gè)對(duì)象復(fù)制到另一個(gè)對(duì)象。Dozer 是用來對(duì)兩個(gè)對(duì)象之間屬性轉(zhuǎn)換的工具,有了這個(gè)工具之后,我們將一個(gè)對(duì)象的所有屬性值轉(zhuǎn)給另一個(gè)對(duì)象時(shí),就不需要再去寫重復(fù)的調(diào)用 set 和 get 方法。
最重要的是,Dozer 可以確保來自數(shù)據(jù)庫的內(nèi)部域?qū)ο蟛粫?huì)滲入外部表示層或外部消費(fèi)者,它還可以將域?qū)ο笥成涞酵獠?API 調(diào)用,反之亦然。
2. 為什么要使用映射框架 Dozer
映射框架在分層架構(gòu)中作用很大,我們可以通過封裝對(duì)特定數(shù)據(jù)對(duì)象的更改與將這些對(duì)象傳播到其他層(即外部服務(wù)數(shù)據(jù)對(duì)象、域?qū)ο蟆?shù)據(jù)傳輸對(duì)象、內(nèi)部服務(wù)數(shù)據(jù)對(duì)象)來創(chuàng)建抽象層。 映射框架非常適合在負(fù)責(zé)將數(shù)據(jù)從一個(gè)數(shù)據(jù)對(duì)象映射到另一個(gè)數(shù)據(jù)對(duì)象的 Mapper 類型類中使用。
對(duì)于分布式系統(tǒng)架構(gòu)而言,副作用是域?qū)ο笤诓煌到y(tǒng)之間的傳遞。那么,我們不希望內(nèi)部域?qū)ο蟊┞对谕獠?,也不允許外部域?qū)ο鬂B入我們的系統(tǒng)。
數(shù)據(jù)對(duì)象之間的映射傳統(tǒng)上是通過在對(duì)象之間復(fù)制數(shù)據(jù)的手動(dòng)編碼值對(duì)象組裝器(或轉(zhuǎn)換器)來解決的。Dozer 作為一個(gè)強(qiáng)大、通用、靈活、可重用和可配置的開源映射框架,節(jié)省了開發(fā)人員開發(fā)某種自定義映射器框架帶來的時(shí)間成本。
3. Dozer 映射框架的使用
Dozer 的 maven 坐標(biāo):
<dependency> <groupId>com.github.dozermapper</groupId> <artifactId>dozer-core</artifactId> <version>6.5.0</version> </dependency>
為了簡(jiǎn)化使用方式,Dozer 還提供了 starter,其 maven 坐標(biāo)為:
<dependency> <groupId>com.github.dozermapper</groupId> <artifactId>dozer-spring-boot-starter</artifactId> <version>6.5.0</version> </dependency>
下面就開始著手在 springboot 項(xiàng)目中使用 dozer 映射框架。工程的目錄結(jié)構(gòu)如下圖所示:
第一步,創(chuàng)建 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>
第二步,創(chuàng)建 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/ 目錄下創(chuàng)建 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/ 目錄下創(chuàng)建 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"> <!--描述兩個(gè)類中屬性的對(duì)應(yīng)關(guān)系,對(duì)于兩個(gè)類中同名的屬性可以不映射--> <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 指定映射的標(biāo)識(shí),在程序中通過此標(biāo)識(shí)來確定使用當(dāng)前這個(gè)映射關(guān)系 --> <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
第六步,創(chuàng)建主啟動(dòng)類 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); } }
第七步,編寫單元測(cè)試 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); } }
到此這篇關(guān)于SpringBoot整合Dozer映射框架流程詳解的文章就介紹到這了,更多相關(guān)SpringBoot Dozer映射框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)詳解
堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下2022-07-07Java Spring MVC 上傳下載文件配置及controller方法詳解
這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09通過Docker啟動(dòng)Solace并在Spring?Boot通過JMS整合Solace的操作方法
本文將介紹如何在Spring中使用,雖然代碼使用的是Spring Boot,但并沒有使用相關(guān)starter,跟Spring的整合一樣,可通用,JMS是通過的消息處理框架,可以深入學(xué)習(xí)一下,不同的MQ在JMS的整合上都是類似的,感興趣的朋友跟隨小編一起看看吧2023-01-01Resty開發(fā)restful版本的Jfinal深入研究
這篇文章主要為大家介紹了Resty開發(fā)restful版本的Jfinal深入研究有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03總結(jié)Java常用加解密方法AES?SHA1?md5
這篇文章主要為大家介紹了Java常用加密方法AES?SHA1?md5總結(jié)及示例demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06