一、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-hk/n/239030.html