22、MapStruct對象映射(she)轉換
一、對象(xiang)轉(zhuan)換(huan)方式:
1、SET與GET賦值方式:
SET與GET賦值(zhi)方(fang)(fang)式(shi)是(shi)最基本的一種對象轉換(huan)方(fang)(fang)式(shi)。通過手動調用源(yuan)對象的 getter 方(fang)(fang)法,獲取(qu)源(yuan)對象的屬(shu)性值(zhi),然后通過目標對象的 setter方(fang)(fang)法將值(zhi)設置到目標對象中。
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 庫(ku)提供的(de)(de)(de)工具(ju)類,它可(ke)以簡化對(dui)(dui)象之間(jian)的(de)(de)(de)屬性(xing)復制(zhi)工作。通(tong)過 BeanUtils.copyProperties() 方法,可(ke)以將(jiang)一個對(dui)(dui)象的(de)(de)(de)屬性(xing)值(zhi)復制(zhi)到(dao)另一個對(dui)(dui)象中,通(tong)常用(yong)于(yu)對(dui)(dui)象之間(jian)的(de)(de)(de)轉換。該方法會自(zi)動映射源(yuan)對(dui)(dui)象和(he)目標(biao)對(dui)(dui)象的(de)(de)(de)同名屬性(xing)。
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); // 復(fu)制屬(shu)性(xing) return userEntity; } }
3、MapStruct對象映射轉換方式:
底層基于SET與GET賦值方(fang)式(shi)實(shi)現
| 特性 | SET與GET賦值方式 | BeanUtils工具類 | MapStruct對象映射 |
|---|---|---|---|
|
實現方式 |
手動調用 |
使用 |
編譯時生成代碼(ma),通過注解定(ding)義(yi)映射 |
|
優點 |
直接且靈活,完(wan)全(quan)可(ke)控 |
代碼簡潔,易于使用 |
高性能(neng),支持復雜映射,自定義規(gui)則(ze) |
|
缺點 |
代碼冗長,易出錯 |
僅支持簡單類型轉換 |
配置較為(wei)復雜,需依賴(lai) MapStruct |
|
性能 |
較(jiao)低(尤其是大量屬性時(shi)) |
較低(反射機制) |
高(編(bian)譯時生成(cheng)代(dai)碼) |
二、MapStruct對象映射轉換方(fang)式(shi)的(de)基本(ben)使用:
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版本(ben)與SpringBoot版本(ben)相對應MapStruct依賴(lai)必(bi)須(xu)在Lombok依賴(lai)的后面
2、常規處理:
在MapStruct中,若(ruo)兩個類型(xing)中的屬性名稱相同,則會自(zi)動(dong)完成轉換。
import com.example.mapstructdemo.model.UserBasicVO; import com.example.mapstructdemo.model.UserResponseVO; import org.mapstruct.Mapper; /** * 常(chang)規處理轉(zhuan)換: * 在MapStruct中,若兩個類型中的(de)屬(shu)性名(ming)稱相同,則會自動完成轉(zhuan)換。 * */ @Mapper(componentModel = "spring") public interface ConventionalProcessingConversion { UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO); }
3、特殊處理:
在MapStruct中,若想自定義(yi)轉換的屬性(xing),則可使用@Mapping注解進(jin)行處理。
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、時(shi)間格式(shi)化(hua) * 2、返回值(zhi)處理 * 3、默(mo)認(ren)值(zhi)設置 * ...... * * */ @Mapper(componentModel = "spring", imports = {TypeEnums.class}) //TypeEnums:自定(ding)義枚舉(ju)轉換等方式 public interface SpecialProcessingConversion { @Mappings({ @Mapping(target = "type",expression = "java(TypeEnums.getValue(userBasicVO.getType()))"),//返回值(zhi)處理 @Mapping(target = "createDate", dateFormat = "yyyy-MM-dd HH:mm:ss"),//日(ri)期格式轉換(huan) @Mapping(target = "info", source = "sex"), //target用來指定(ding)要處(chu)理的目標類型的屬性,source用來指定(ding)源類型的屬性名 // @Mapping(target = "info", source = "sex", defaultExpression = "java( com.demo.UserSexMethod.getDefaultSex())"), //sex為(wei)null,設置自(zi)定義默認(ren)值 @Mapping(target = "info2", constant = "備注信息")//賦值 }) UserResponseVO toHandelUserInfo(UserBasicVO userBasicVO); }
