一、MapStruct簡介
MapStruct是一個Java註解處理器,用於生成類型安全的Bean映射代碼。使用MapStruct,我們可以輕鬆地編寫用於將類型A的實例轉換為類型B的實例的映射器類,而無需手寫大量重複的代碼。因此,MapStruct旨在解決Java中類型轉換代碼的冗長和重複問題,提高開發效率,同時保持代碼質量。
二、MapStruct的特點
1. 支持註解引導配置,通常情況下不需要額外配置文件。
2. 通過生成結果提供了良好的性能和類型安全性。
3. 可擴展,支持自定義轉換器。
4. 通過@Mapper註解輕鬆定義類型轉換規則。該註解包括許多屬性,這些屬性控制了生成的映射器類的特性,如命名策略、映射解析策略等。
三、MapStruct的使用
3.1 安裝
MapStruct可以通過maven進行安裝,只需在項目的pom.xml文件中添加以下依賴即可:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.4.2.Final</version>
</dependency>
3.2 定義映射器類
在MapStruct中,我們需要定義一個接口,用@Mapper註解標記該接口以及該接口中的抽象方法作為Mapper的映射規則。
@Mapper
public interface UserMapper {
UserDto UserToUserDto(User user);
User UserDtoToUser(UserDto userDto);
}
上述代碼定義了一個UserMapper接口,其中包含兩個抽象方法。這些方法定義了兩種類型之間的轉換,即User和UserDto。通過定義這個Mapper接口,MapStruct將會自動生成UserMapperImpl類作為UserMapper接口實現類。
3.3 使用映射器類
一旦我們定義了Mapper接口,就可以在應用程序中使用它了。在示例中,我們要將User實例轉換為UserDto實例,只需要通過注入UserMapper來執行轉換。例如:
@Autowired
private UserMapper userMapper;
public void someMethod(User user) {
UserDto userDto = userMapper.UserToUserDto(user);
// ...
}
3.4 高級映射
MapStruct還提供了高級的映射功能,如映射一個具體類型到另一個具體類型、映射字段注入等。下面是一些常見的高級映射場景的代碼示例。
3.4.1 映射一個具體類型到另一個具體類型
在MapStruct中,我們也可以映射一個具體類型,而不是只與接口相關。下面是映射一個具體類型的示例代碼:
@Mapper
public class UserMapper {
public static final UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
public UserDto UserToUserDto(User user) {
return new UserDto(
user.getUserId(),
user.getFirstName() + " " + user.getLastName(),
user.getEmail()
);
}
}
在此示例中,我們使用靜態的UserMapper.INSTANCE方法來獲取UserMapper的實例。然後,我們定義了將User映射到UserDto的方法。請注意,在這個方法中,我們直接將屬性設置為UserDto實例的構造函數的參數,而不是通過對象映射獲取屬性。
3.4.2 映射字段注入
在某些情況下,我們可能需要將目標對象注入到Mapper中以進行進一步轉換。這種情況下,我們可以使用@MappingTarget註解。例如,假設我們有以下兩個類:
public class User {
private String firstName;
private String lastName;
private String email;
// getters and setters
}
public class UserDto {
private String name;
private String email;
// getters and setters
}
我們需要映射User對象的firstName和lastName屬性到UserDto類的name屬性中。然而,UserDto的name屬性需要以”firstName lastName”的格式設置。為了實現這種轉換,我們可以使用以下代碼:
@Mapper
public interface UserMapper {
void userToUserDto(User user, @MappingTarget UserDto userDto);
@AfterMapping
default void setFullName(@MappingTarget UserDto userDto, User user) {
userDto.setName(user.getFirstName() + " " + user.getLastName());
}
}
在這個映射器類中,我們定義了一個void userToUserDto(User user, @MappingTarget UserDto userDto)方法來映射User到UserDto。我們也定義了一個@AfterMapping註解方法setFullName(),該方法在映射完成後執行,並將firstName和lastName屬性組合為name屬性。請注意,@MappingTarget註解用於標識目標對象,這裡是UserDto對象,以便我們可以將值注入到目標對象中。
3.4.3 映射集合類型
MapStruct也支持映射集合類型。例如,在以下場景中,我們需要將User集合映射為UserDto集合:
List<User> userList = ... ; List<UserDto> userDtoList = UserMapper.INSTANCE.userListToUserDtoList(userList);
以下是映射器方法的代碼示例:
@Mapper
public interface UserMapper {
List<UserDto> userListToUserDtoList(List<User> userList);
}
四、總結
MapStruct是一個強大的類型安全Java bean映射框架。它使用註解處理器在編譯時生成類型安全的映射代碼,有助於減少手動處理重複的轉換代碼,提高代碼質量和開發效率。在我們使用MapStruct將類轉換為另一個類時,它可以為我們提供良好的性能和類型安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/239030.html
微信掃一掃
支付寶掃一掃