22、MapStruct對象映射轉換
一、對象轉換方式:
1、SET與GET賦值方式:
SET與GET賦值方式是最基本的一種對象轉換方式。通過手動調用源對象的 getter 方法,獲取源對象的屬性值,然后通過目標對象的 setter方法將值設置到目標對象中。
public class UserDTO { private String name; private int age; // Getters and Setters } public class UserEntity { private String name; private int age; // Getters and Setters } public class Converter { public UserDTO convertToDTO(UserEntity userEntity) { UserDTO userDTO = new UserDTO(); userDTO.setName(userEntity.getName()); userDTO.setAge(userEntity.getAge()); return userDTO; } public UserEntity convertToEntity(UserDTO userDTO) { UserEntity userEntity = new UserEntity(); userEntity.setName(userDTO.getName()); userEntity.setAge(userDTO.getAge()); return userEntity; } }
2、BeanUtils工具類轉換方式:
BeanUtils 是 Apache Commons BeanUtils 庫提供的工具類,它可以簡化對象之間的屬性復制工作。通過 BeanUtils.copyProperties() 方法,可以將一個對象的屬性值復制到另一個對象中,通常用于對象之間的轉換。該方法會自動映射源對象和目標對象的同名屬性。
import org.apache.commons.beanutils.BeanUtils; public class UserDTO { private String name; private int age; // Getters and Setters } public class UserEntity { private String name; private int age; // Getters and Setters } public class Converter { public UserDTO convertToDTO(UserEntity userEntity) throws Exception { UserDTO userDTO = new UserDTO(); BeanUtils.copyProperties(userDTO, userEntity); // 復制屬性 return userDTO; } public UserEntity convertToEntity(UserDTO userDTO) throws Exception { UserEntity userEntity = new UserEntity(); BeanUtils.copyProperties(userEntity, userDTO); // 復制屬性 return userEntity; } }
3、MapStruct對象映射轉換方式:
底層基于SET與GET賦值方式實現
| 特性 | SET與GET賦值方式 | BeanUtils工具類 | MapStruct對象映射 |
|---|---|---|---|
|
實現方式 |
手動調用 |
使用 |
編譯時生成代碼,通過注解定義映射 |
|
優點 |
直接且靈活,完全可控 |
代碼簡潔,易于使用 |
高性能,支持復雜映射,自定義規則 |
|
缺點 |
代碼冗長,易出錯 |
僅支持簡單類型轉換 |
配置較為復雜,需依賴 MapStruct |
|
性能 |
較低(尤其是大量屬性時) |
較低(反射機制) |
高(編譯時生成代碼) |
二、MapStruct對象映射轉換方式的基本使用:
1、POM依賴:
<!--MapStruct 依賴-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.1.Final</version>
</dependency>
<!--MapStruct 注解處理器-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>
注:
MapStruct版本與SpringBoot版本相對應MapStruct依賴必須在Lombok依賴的后面
2、常規處理:
在MapStruct中,若兩個類型中的屬性名稱相同,則會自動完成轉換。
import com.example.mapstructdemo.model.UserBasicVO; import com.example.mapstructdemo.model.UserResponseVO; import org.mapstruct.Mapper; /** * 常規處理轉換: * 在MapStruct中,若兩個類型中的屬性名稱相同,則會自動完成轉換。 * */ @Mapper(componentModel = "spring") public interface ConventionalProcessingConversion { UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO); }
3、特殊處理:
在MapStruct中,若想自定義轉換的屬性,則可使用@Mapping注解進行處理。
import com.example.mapstructdemo.model.TypeEnums; import com.example.mapstructdemo.model.UserBasicVO; import com.example.mapstructdemo.model.UserResponseVO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; /** * 特殊處理轉換: * 1、時間格式化 * 2、返回值處理 * 3、默認值設置 * ...... * * */ @Mapper(componentModel = "spring", imports = {TypeEnums.class}) //TypeEnums:自定義枚舉轉換等方式 public interface SpecialProcessingConversion { @Mappings({ @Mapping(target = "type",expression = "java(TypeEnums.getValue(userBasicVO.getType()))"),//返回值處理 @Mapping(target = "createDate", dateFormat = "yyyy-MM-dd HH:mm:ss"),//日期格式轉換 @Mapping(target = "info", source = "sex"), //target用來指定要處理的目標類型的屬性,source用來指定源類型的屬性名 // @Mapping(target = "info", source = "sex", defaultExpression = "java( com.demo.UserSexMethod.getDefaultSex())"), //sex為null,設置自定義默認值 @Mapping(target = "info2", constant = "備注信息")//賦值 }) UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO); }

浙公網安備 33010602011771號