Java高效映射工具M(jìn)apStruct的使用示例
引言
MapStruct 是一個 Java 注解處理器,用于在不同 Java Beans 或數(shù)據(jù)傳輸對象(DTOs)之間自動生成類型安全的映射代碼。這是一個編譯時映射框架,意味著它利用注解在編譯時生成代碼,從而提高了性能和減少了運(yùn)行時的開銷。
它適用于 Java 8 和更高版本。以下是一些 MapStruct 的基本使用示例:
1. 基本映射
假設(shè)你有兩個簡單的類 Person 和 PersonDTO,需要將 Person 實(shí)體映射到 PersonDTO 數(shù)據(jù)傳輸對象。
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ù)雜類型映射
如果你的對象包含復(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á)式
有時,你可能需要在映射過程中使用自定義邏輯。MapStruct 允許你使用 Java 表達(dá)式來實(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. 使用自定義方法
在某些情況下,你可能需要自定義映射邏輯。你可以在映射器接口中定義自己的方法來實(shí)現(xiàn)這一點(diǎn)。
Person.java
public class Person {
private String birthdate; // 假設(shè)這是一個字符串
// 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 將生成一個 Spring 組件,可以被注入到你的服務(wù)中。
7. 更新現(xiàn)有對象
MapStruct 也可以用于更新現(xiàn)有對象,而不是創(chuàng)建新的。
PersonMapper.java
@Mapper
public interface PersonMapper {
void updatePersonFromDTO(PersonDTO personDto, @MappingTarget Person person);
}
這個方法將會根據(jù) PersonDTO 中的數(shù)據(jù)更新一個已存在的 Person 對象,而不是創(chuàng)建一個新的。
8. 多源映射
你可以從多個源對象映射到一個目標(biāo)對象。
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)是它提供了一種高效、類型安全且易于使用的方式來自動化對象間的數(shù)據(jù)映射。這使得它成為處理 Java 應(yīng)用中數(shù)據(jù)轉(zhuǎn)換的理想選擇,尤其是在涉及復(fù)雜對象和多層架構(gòu)的場景中。通過減少手寫的樣板代碼和提供清晰的映射定義,MapStruct 可以幫助開發(fā)人員節(jié)省時間,減少錯誤,并提高代碼的可維護(hù)性。
以上就是Java注解處理器MapStruct的使用示例的詳細(xì)內(nèi)容,更多關(guān)于Java MapStruct使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決SpringBoot運(yùn)行報錯:找不到或無法加載主類的問題
這篇文章主要介紹了解決SpringBoot運(yùn)行報錯:找不到或無法加載主類的問題,具有很好的參考價值,對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-09-09
java selenium教程環(huán)境搭建基于Maven
本文主要介紹Java selenium 環(huán)境的安裝,這里介紹了基于Maven的環(huán)境搭建,有需要的小伙伴可以參考下2016-08-08
Java實(shí)現(xiàn)隨機(jī)抽獎的三種方法
在Java中實(shí)現(xiàn)隨機(jī)抽獎的方法,通常我們會使用java.util.Random類來生成隨機(jī)數(shù),然后基于這些隨機(jī)數(shù)來選擇中獎?wù)?以下將給出幾種常見的隨機(jī)抽獎實(shí)現(xiàn)方式,需要的朋友可以參考下2024-09-09
Java自定義異常_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java自定義異常_動力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-04-04
通過prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)的操作流程
jmx_exporter用于從Java應(yīng)用程序中提取JMX指標(biāo),適用于SpringBoot應(yīng)用,通過下載jar包和配置文件,可以抓取JVM基礎(chǔ)指標(biāo),要獲取應(yīng)用級別指標(biāo),需要集成Prometheus客戶端庫并自定義指標(biāo),本文給大家介紹了如何通過prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)2025-02-02

