Java高效映射工具M(jìn)apStruct的使用示例
引言
MapStruct 是一個(gè) Java 注解處理器,用于在不同 Java Beans 或數(shù)據(jù)傳輸對(duì)象(DTOs)之間自動(dòng)生成類(lèi)型安全的映射代碼。這是一個(gè)編譯時(shí)映射框架,意味著它利用注解在編譯時(shí)生成代碼,從而提高了性能和減少了運(yùn)行時(shí)的開(kāi)銷(xiāo)。
它適用于 Java 8 和更高版本。以下是一些 MapStruct 的基本使用示例:
1. 基本映射
假設(shè)你有兩個(gè)簡(jiǎn)單的類(lèi) Person 和 PersonDTO,需要將 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ù)雜類(lèi)型映射
如果你的對(duì)象包含復(fù)雜類(lèi)型或自定義類(lèi)型,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. 使用依賴(lài)注入
如果你使用 Spring 或類(lèi)似框架,可以將 MapStruct 與依賴(lài)注入框架結(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)型安全且易于使用的方式來(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包(包含依賴(lài)jar包)
這篇文章主要介紹了Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴(lài)jar包) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Java中的CopyOnWriteArrayList你了解嗎
CopyOnWriteArrayList是Java集合框架中的一種線(xiàn)程安全的List實(shí)現(xiàn),這篇文章主要來(lái)和大家聊聊CopyOnWriteArrayList的簡(jiǎn)單使用,需要的可以參考一下2023-06-06
解析ConcurrentHashMap: put方法源碼分析
ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類(lèi)似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見(jiàn)問(wèn)題---ConcurrentHashMap知識(shí),一起看看吧2021-06-06
SpringBoot實(shí)現(xiàn)websocket服務(wù)端及客戶(hù)端的詳細(xì)過(guò)程
文章介紹了WebSocket通信過(guò)程、服務(wù)端和客戶(hù)端的實(shí)現(xiàn),以及可能遇到的問(wèn)題及解決方案,感興趣的朋友一起看看吧2024-12-12
集成Spring Redis緩存的實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于集成Spring Redis緩存的實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
java定位死鎖的三種方法(jstack、Arthas和Jvisualvm)
這篇文章主要給大家介紹了關(guān)于java定位死鎖的三種方法,分別是通過(guò)jstack定位死鎖信息、通過(guò)Arthas工具定位死鎖以及通過(guò) Jvisualvm 定位死鎖,文中還介紹了死鎖的預(yù)防方法,需要的朋友可以參考下2021-09-09

