欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java高效映射工具M(jìn)apStruct的使用示例

 更新時(shí)間:2023年12月25日 10:38:30   作者:一只愛(ài)擼貓的程序猿  
MapStruct 是一個(gè) Java 注解處理器,用于在不同 Java Beans 或數(shù)據(jù)傳輸對(duì)象(DTOs)之間自動(dòng)生成類型安全的映射代碼,這是一個(gè)編譯時(shí)映射框架,意味著它利用注解在編譯時(shí)生成代碼,本文將給大家介紹一下Java注解處理器MapStruct的使用示例,需要的朋友可以參考下

引言

MapStruct 是一個(gè) Java 注解處理器,用于在不同 Java Beans 或數(shù)據(jù)傳輸對(duì)象(DTOs)之間自動(dòng)生成類型安全的映射代碼。這是一個(gè)編譯時(shí)映射框架,意味著它利用注解在編譯時(shí)生成代碼,從而提高了性能和減少了運(yùn)行時(shí)的開(kāi)銷。

它適用于 Java 8 和更高版本。以下是一些 MapStruct 的基本使用示例:

1. 基本映射

假設(shè)你有兩個(gè)簡(jiǎn)單的類 PersonPersonDTO,需要將 Person 實(shí)體映射到 PersonDTO 數(shù)據(jù)傳輸對(duì)象。

Person.java

public class Person {
    private String name;
    private int age;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String name;
    private int age;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    PersonDTO personToPersonDTO(Person person);
}

2. 復(fù)雜類型映射

如果你的對(duì)象包含復(fù)雜類型或自定義類型,MapStruct 也可以處理這些。

Address.java

public class Address {
    private String street;
    private String city;
    // getters and setters
}

Person.java (現(xiàn)在包含 Address)

public class Person {
    private String name;
    private int age;
    private Address address;
    // getters and setters
}

PersonDTO.java (同樣包含 Address)

public class PersonDTO {
    private String name;
    private int age;
    private String street;
    private String city;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    
    @Mapping(source = "address.street", target = "street")
    @Mapping(source = "address.city", target = "city")
    PersonDTO personToPersonDTO(Person person);
}

3. 使用表達(dá)式

有時(shí),你可能需要在映射過(guò)程中使用自定義邏輯。MapStruct 允許你使用 Java 表達(dá)式來(lái)實(shí)現(xiàn)這一點(diǎn)。

Person.java

public class Person {
    private String firstName;
    private String lastName;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String fullName;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(expression = "java(person.getFirstName() + ' ' + person.getLastName())", target = "fullName")
    PersonDTO personToPersonDTO(Person person);
}

4. 使用自定義方法

在某些情況下,你可能需要自定義映射邏輯。你可以在映射器接口中定義自己的方法來(lái)實(shí)現(xiàn)這一點(diǎn)。

Person.java

public class Person {
    private String birthdate; // 假設(shè)這是一個(gè)字符串
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private LocalDate birthdate; // 在 DTO 中,我們使用 LocalDate
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(target = "birthdate", source = "birthdate", dateFormat = "yyyy-MM-dd")
    PersonDTO personToPersonDTO(Person person);

    default LocalDate stringToLocalDate(String date) {
        return LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}

5. 映射集合

MapStruct 也能很好地處理集合映射。

PersonMapper.java

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    List<PersonDTO> personsToPersonDTOs(List<Person> persons);
}

6. 使用依賴注入

如果你使用 Spring 或類似框架,可以將 MapStruct 與依賴注入框架結(jié)合使用。

PersonMapper.java

@Mapper(componentModel = "spring")
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}

使用 componentModel = "spring",MapStruct 將生成一個(gè) Spring 組件,可以被注入到你的服務(wù)中。

7. 更新現(xiàn)有對(duì)象

MapStruct 也可以用于更新現(xiàn)有對(duì)象,而不是創(chuàng)建新的。

PersonMapper.java

@Mapper
public interface PersonMapper {
    void updatePersonFromDTO(PersonDTO personDto, @MappingTarget Person person);
}

這個(gè)方法將會(huì)根據(jù) PersonDTO 中的數(shù)據(jù)更新一個(gè)已存在的 Person 對(duì)象,而不是創(chuàng)建一個(gè)新的。

8. 多源映射

你可以從多個(gè)源對(duì)象映射到一個(gè)目標(biāo)對(duì)象。

Address.java

public class Address {
    private String city;
    // getters and setters
}

PersonDTO.java

public class PersonDTO {
    private String name;
    private String city;
    // getters and setters
}

PersonMapper.java

@Mapper
public interface PersonMapper {
    @Mapping(source = "person.name", target = "name")
    @Mapping(source = "address.city", target = "city")
    PersonDTO personAndAddressToDTO(Person person, Address address);
}

總結(jié)

MapStruct 的主要優(yōu)點(diǎn)是它提供了一種高效、類型安全且易于使用的方式來(lái)自動(dòng)化對(duì)象間的數(shù)據(jù)映射。這使得它成為處理 Java 應(yīng)用中數(shù)據(jù)轉(zhuǎn)換的理想選擇,尤其是在涉及復(fù)雜對(duì)象和多層架構(gòu)的場(chǎng)景中。通過(guò)減少手寫(xiě)的樣板代碼和提供清晰的映射定義,MapStruct 可以幫助開(kāi)發(fā)人員節(jié)省時(shí)間,減少錯(cuò)誤,并提高代碼的可維護(hù)性。

以上就是Java注解處理器MapStruct的使用示例的詳細(xì)內(nèi)容,更多關(guān)于Java MapStruct使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java基本類型與byte數(shù)組之間相互轉(zhuǎn)換方法

    Java基本類型與byte數(shù)組之間相互轉(zhuǎn)換方法

    下面小編就為大家?guī)?lái)一篇Java基本類型與byte數(shù)組之間相互轉(zhuǎn)換方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • Java實(shí)現(xiàn)屏幕截圖及剪裁

    Java實(shí)現(xiàn)屏幕截圖及剪裁

    這是一篇入門(mén)級(jí)文章,高手請(qǐng)略過(guò)。在這篇文章中我們將學(xué)習(xí)如何用 Java 對(duì)圖像進(jìn)行剪裁并將剪裁出來(lái)的部分單獨(dú)保存到文件中。
    2014-09-09
  • MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因解析

    MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因解析

    MyBatis Log是IDEA一款下載量非常高的插件,該插件可以對(duì)控制臺(tái)打印的日志進(jìn)行解析,然后將對(duì)應(yīng)的SQL語(yǔ)句整理并拼接好對(duì)應(yīng)的參數(shù),非常方便。這篇文章給大家介紹MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因,感興趣的朋友跟隨小編一起看看吧
    2020-09-09
  • 詳解Java中的println輸入和toString方法的重寫(xiě)問(wèn)題

    詳解Java中的println輸入和toString方法的重寫(xiě)問(wèn)題

    這篇文章主要介紹了Java中的println輸入和toString方法的重寫(xiě),一個(gè)對(duì)象數(shù)組在調(diào)用Arrays.toString打印時(shí),相當(dāng)于遍歷數(shù)組,然后打印里邊每個(gè)對(duì)象,這再打印對(duì)象就調(diào)用對(duì)象自己的toString了,需要的朋友可以參考下
    2022-04-04
  • Java中JSON數(shù)據(jù)操作與處理全面指南

    Java中JSON數(shù)據(jù)操作與處理全面指南

    JSON(JavaScript Object Notation)是數(shù)據(jù)交換的輕量級(jí)格式,它以易于人類閱讀和機(jī)器解析的方式組織數(shù)據(jù),基于鍵值對(duì),在Java開(kāi)發(fā)中,處理JSON數(shù)據(jù)通常涉及使用Jackson、Gson、Fastjson等庫(kù),本文給大家介紹JSON數(shù)據(jù)操作與處理全面指南,感興趣的朋友一起看看吧
    2024-10-10
  • 基于Java實(shí)現(xiàn)簡(jiǎn)易的七星彩號(hào)碼生成器

    基于Java實(shí)現(xiàn)簡(jiǎn)易的七星彩號(hào)碼生成器

    七星彩是中國(guó)體育彩票的一種玩法,由中國(guó)國(guó)家體育總局體育彩票管理中心統(tǒng)一發(fā)行。本文為大家準(zhǔn)備了一個(gè)七星彩號(hào)碼生成器Java工具類,感興趣的可以了解一下
    2022-08-08
  • Java 鎖粗化與循環(huán)問(wèn)題

    Java 鎖粗化與循環(huán)問(wèn)題

    這篇文章主要介紹了Java 鎖粗化與循環(huán)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 解析ConcurrentHashMap: put方法源碼分析

    解析ConcurrentHashMap: put方法源碼分析

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見(jiàn)問(wèn)題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • Java多線程之火車(chē)售票系統(tǒng)

    Java多線程之火車(chē)售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java多線程之火車(chē)售票系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用springmvc參數(shù)接收boolean類型參數(shù)的問(wèn)題

    使用springmvc參數(shù)接收boolean類型參數(shù)的問(wèn)題

    這篇文章主要介紹了使用springmvc參數(shù)接收boolean類型參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論