欧美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)文章

  • Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)

    Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)

    這篇文章主要介紹了Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Java中的CopyOnWriteArrayList你了解嗎

    Java中的CopyOnWriteArrayList你了解嗎

    CopyOnWriteArrayList是Java集合框架中的一種線程安全的List實(shí)現(xiàn),這篇文章主要來(lái)和大家聊聊CopyOnWriteArrayList的簡(jiǎn)單使用,需要的可以參考一下
    2023-06-06
  • J2EE中的struts2表單細(xì)節(jié)處理

    J2EE中的struts2表單細(xì)節(jié)處理

    這篇文章主要介紹了J2EE中的struts2表單細(xì)節(jié)處理的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java?Object類equals方法

    Java?Object類equals方法

    這篇文章主要介紹了Java?Object類equals方法,Object類位于java.lang包中,java.lang包包含著Java最基礎(chǔ)和核心的類,在編譯時(shí)會(huì)自動(dòng)導(dǎo)入,下文更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • 為什么Java volatile++不是原子性的詳解

    為什么Java volatile++不是原子性的詳解

    這篇文章主要給大家介紹了關(guān)于為什么Java volatile++不是原子性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 解析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
  • SpringBoot實(shí)現(xiàn)websocket服務(wù)端及客戶端的詳細(xì)過(guò)程

    SpringBoot實(shí)現(xiàn)websocket服務(wù)端及客戶端的詳細(xì)過(guò)程

    文章介紹了WebSocket通信過(guò)程、服務(wù)端和客戶端的實(shí)現(xiàn),以及可能遇到的問(wèn)題及解決方案,感興趣的朋友一起看看吧
    2024-12-12
  • 集成Spring Redis緩存的實(shí)現(xiàn)

    集成Spring Redis緩存的實(shí)現(xiàn)

    今天小編就為大家分享一篇關(guān)于集成Spring Redis緩存的實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • MyBatis5中Spring集成MyBatis事物管理

    MyBatis5中Spring集成MyBatis事物管理

    這篇文章主要介紹了MyBatis5中MyBatis集成Spring事物管理的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • java定位死鎖的三種方法(jstack、Arthas和Jvisualvm)

    java定位死鎖的三種方法(jstack、Arthas和Jvisualvm)

    這篇文章主要給大家介紹了關(guān)于java定位死鎖的三種方法,分別是通過(guò)jstack定位死鎖信息、通過(guò)Arthas工具定位死鎖以及通過(guò) Jvisualvm 定位死鎖,文中還介紹了死鎖的預(yù)防方法,需要的朋友可以參考下
    2021-09-09

最新評(píng)論