首頁 > 軟體

關於Java中的dozer物件轉換問題

2022-08-29 22:05:43

Java中的dozer物件轉換

1、dozer介紹

Dozer是Java Bean到Java Bean對映器,它以遞迴方式將資料從一個物件複製到另一個物件。 dozer是用來對兩個物件之間屬性轉換的工具,有了這個工具之後,我們將一個物件的所有屬性值轉給另一個物件時,就不需要再去寫重複的呼叫set和get方法了。dozer其實是對我們熟知的beanutils的封裝。

2、依賴座標

<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>

3、建立測試工廠【dozer_demo】

3.1、引入對應的依賴

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>dozer_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <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>

3.2、建立UserDTO和UserEntity

dto:使用者後端與前端之間的資料互動或後端之間的資料互動
entity:對應的是資料庫列欄位屬性

package com.zcl.dto;

import lombok.Data;

/**
 * 專案名稱:dozer_demo
 * 描述:使用者資料傳輸物件
 *
 * @author zhong
 * @date 2022-08-29 10:41
 */
@Data
public class UserDTO {
    private String userId;
    private String userName;
    private int userAge;
    private String address;
    private String birthday;
}

實際專案中的屬性命名可能是一致的,而下面的使用屬性故意設定為個別屬性不一致,測試屬性名不一致的時候如何進行物件的轉換

package com.zcl.UserEntity;

import lombok.Data;

import java.util.Date;

/**
 * 專案名稱:dozer_demo
 * 描述:使用者資料實體
 *
 * @author zhong
 * @date 2022-08-29 10:42
 */
@Data
public class UserEntity {
    private String id;
    private String name;
    private int age;
    private String address;
    private Date birthday;
}

3.3、在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>

3.4、在resources/dozer/目錄下建立dozer的對映檔案biz.dozer.xml

該對映檔案的主要作用是:將兩個JavaBean不同的屬性欄位進行描述(誰對應誰)的對映關係
檔名稱可以自定義
date-format="yyyy-MM-dd"是上一個組態檔所定義的全域性格式
下面的組態檔中通過定義組態檔的全路徑名稱來指定,如
<class-a>com.itheima.entity.UserEntity</class-a>
通過field來指定兩個物件之間的對映關係

<?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.zcl.entity.UserEntity</class-a>
        <class-b>com.zcl.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.zcl.entity.UserEntity</class-a>
        <class-b>com.zcl.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>

3.5、編寫application.yml檔案

如果不在組態檔中指定的化,上面編寫的兩個對映關係組態檔都不會生效

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

3.6、編寫專案啟動類

package com.zcl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 專案名稱:dozer_demo
 * 描述:啟動類
 *
 * @author zhong
 * @date 2022-08-29 11:01
 */
@SpringBootApplication
public class DozerApp {
    public static void main(String[] args) {
        SpringApplication.run(DozerApp.class, args);
    }
}

3.7、編寫單元測試

package com.zcl.test;

import com.github.dozermapper.core.Mapper;
import com.zcl.DozerApp;
import com.zcl.dto.UserDTO;
import com.zcl.entity.UserEntity;
import org.junit.jupiter.api.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;

/**
 * 專案名稱:dozer_demo
 * 描述:測試類
 *
 * @author zhong
 * @date 2022-08-29 11:03
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DozerApp.class)
public class DozerTest {
    /**
     * 注入dozer通過的物件,進行兩個物件之間的複製
     */
    @Autowired
    private Mapper mapper;
    @Test
    public void testDozer1(){
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("itcast");
        userDTO.setUserAge(20);
        userDTO.setAddress("bj");
        userDTO.setBirthday("2010-11-20");

        // 呼叫map方法進行復制(原資料,複製的目標物件)
        UserEntity user = mapper.map(userDTO, UserEntity.class);
        System.out.println(user);
        // UserEntity(id=100, name=itcast, age=20, address=bj, birthday=Sat Nov 20 00:00:00 CST 2010)
    }

    @Test
    public void testDozer2(){
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("itcast");
        userDTO.setUserAge(20);
        userDTO.setAddress("bj");
        userDTO.setBirthday("2010-11-20");

        UserEntity user = new UserEntity();
        user.setId("200");
        System.out.println(user);
        // UserEntity(id=200, name=null, age=0, address=null, birthday=null)
        mapper.map(userDTO,user);
        System.out.println(user);
        // UserEntity(id=100, name=itcast, age=20, address=bj, birthday=Sat Nov 20 00:00:00 CST 2010)
    }

    @Test
    public void testDozer3(){
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("100");
        userDTO.setUserName("itcast");
        userDTO.setUserAge(20);
        userDTO.setAddress("bj");

        UserEntity user = new UserEntity();
        System.out.println(user);
        // UserEntity(id=null, name=null, age=0, address=null, birthday=null)
        mapper.map(userDTO,user,"user");
        System.out.println(user);
        // UserEntity(id=100, name=itcast, age=20, address=bj, birthday=null)
    }
}

到此這篇關於Java中的dozer物件轉換的文章就介紹到這了,更多相關Java dozer物件轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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