版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Java中的MapStruct用法詳解目錄1MapStruct配置2原理性能2.1實現(xiàn)原理3使用方法3.1轉換器的檢索3.1.1使用Mappers工廠獲取3.1.2通過依賴注入的方式獲取3.2簡單映射3.2.1基本映射3.2.2多源參數映射3.2.3更新對象3.3數據類型轉換3.3.1對于基礎數據類型會進行自動隱式的轉換3.3.2指定轉換格式3.3.3屬性為復雜對象的映射3.3.4自定義轉換器3.3.5使用限定符限定使用轉換方法3.4Map的映射3.5枚舉值之間的轉換3.6定制Bean生成3.7缺省值和常量3.8存在繼承關系的結果處理3.9映射關系繼承3.10復雜映射的實現(xiàn)3.10.1使用java表達式進行映射3.10.2使用裝飾器進行映射3.10.3使用前后置處理實現(xiàn)復雜映射
1MapStruct配置
MapStuct的使用非常簡單,把對應的jar包引入即可。
properties
mapstruct.version1.3.1.Final/mapstruct.version
/properties
dependency
groupIdorg.mapstruct/groupId
artifactIdmapstruct/artifactId
version${mapstruct.version}/version
/dependency
dependency
groupIdorg.mapstruct/groupId
artifactIdmapstruct-processor/artifactId
version${mapstruct.version}/version
/dependency
2原理性能
2.1實現(xiàn)原理
對象拷貝工具實現(xiàn)上一般分為2種:
(1)在運行時,通過反射調用set/get方法或者直接對成員變量進行賦值。
(2)在編譯期,生成調用get/set方法進行賦值的代碼,生成對應的class文件。
MapStrut屬于第二種,在編譯期間消耗少許的時間,換取運行時的高性能。
接口聲明:
@Mapper
publicinterfaceProductAssembler{
SkuDTOtoDTO(Skusku);
}
編輯生成的class反編譯
publicclassProductAssemblerImplimplementsProductAssembler{
@Override
publicSkuDTOtoDTO(Skusku){
if(sku==null){
returnnull;
SkuDTOskuDTO=newSkuDTO();
skuDTO.setSkuId(sku.getSkuId());
returnskuDTO;
}
3使用方法
使用@Mapper注解,聲明映射器,可以是接口,或者抽象類。
使用@Mapping注解,實現(xiàn)靈活的字段映射,定制映射的規(guī)則。
3.1轉換器的檢索
在聲明好轉換接口之后,MapStruct提供幾種方式獲取生成的Mapper映射器。
3.1.1使用Mappers工廠獲取
可以通過提供的Mappers工廠類,獲取指定的類型。
@Mapper
publicinterfaceAssembler{
//使用工廠方法獲取Mapper實例
AssemblerINSTANCE=Mappers.getMapper(Assembler.class);
ProductDTOtoDTO(Productproduct);
}
3.1.2通過依賴注入的方式獲取
MapStuct同時支持和其他框架結合,通過依賴注入的方式獲取Mapper實例。目前支持spring和cdi。
@Mapper(componentModel="spring")
publicinterfaceAssembler{
ProductDTOtoDTO(Productproduct);
}
@Component
publicclassAssemblerImplimplementsAssembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
returnproductDTO;
}
3.2簡單映射
3.2.1基本映射
對于同名同屬性的字段,無需特別聲明指定,自動轉換。
對于不同名相同屬性的字段,可以使用Mapping注解指定。
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProduct{
privateStringproductId;
privateStringname;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=-6780322740093464581L;
privateStringproductId;
privateStringproductName;
}
定義映射器:
@Mapper(componentModel="spring")
publicinterfaceAssembler{
@Mapping(source="name",target="productName")
ProductDTOtoDTO(Productproduct);
}
生成的映射器試實現(xiàn):
@Component
publicclassAssemblerImplimplementsAssembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductName(product.getName());//不同字段名映射
productDTO.setProductId(product.getProductId());//相同映射名自動轉換
returnproductDTO;
}
3.2.2多源參數映射
支持把多個參數映射成一個類型,使用@Mapping指定即可。
@Mapper(componentModel="spring")
publicinterfaceDemo6Assembler{
@Mapping(target="productId",source="ductId")
@Mapping(target="desc",source="detail.desc")
ProductDTOtoDetailDTO(Productproduct,ProductDetaildetail);
}
3.2.3更新對象
映射時除了生成新的新對象外,還支持現(xiàn)存對象的更新:
@Mapper(componentModel="spring")
publicinterfaceDemo6Assembler{
@Mapping(target="desc",source="desc")
voidupdateDTO(@MappingTargetProductDTOproductDTO,ProductDetaildetail);
}
3.3數據類型轉換
3.3.1對于基礎數據類型會進行自動隱式的轉換
如int、long、String,Integer、Long等。
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProduct{
privateStringproductId;
privateLongprice;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=-6780322740093464581L;
privateintproductId;
privateStringprice;
}
定義映射器:
@Mapper(componentModel="spring")
publicinterfaceAssembler{
ProductDTOtoDTO(Productproduct);
}
生成的映射代碼:
@Component
publicclassAssemblerImplimplementsAssembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
if(product.getProductId()!=null){
//String自動轉int
productDTO.setProductId(Integer.parseInt(product.getProductId()));
if(product.getPrice()!=null){
//Long轉String
productDTO.setPrice(String.valueOf(product.getPrice()));
returnproductDTO;
}
3.3.2指定轉換格式
某些類型的轉換,我們可以指定具體轉換的格式。
(1)對于基本數據類型與String之間的轉換,可以使用numberFormat指定轉換格式,使用的是java.text.DecimalFormat實現(xiàn)。
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProduct{
privateStringproductId;
privateBigDecimalprice;
privateStringstock;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=-6780322740093464581L;
privateStringproductId;
privateStringprice;
privateIntegerstock;
}
映射器定義:
@Mapper(componentModel="spring")
publicinterfaceDemo3Assembler{
@Mapping(target="price",numberFormat="#.00元")//BigDecimal轉換成字符串
@Mapping(target="stock",numberFormat="#個")//字符串轉換成int
ProductDTOtoDTO(Productproduct);
}
實現(xiàn)代碼:
@Component
publicclassDemo3AssemblerImplimplementsDemo3Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
if(product.getPrice()!=null){
//BigDecimal格式化成字符串
productDTO.setPrice(createDecimalFormat("#.00元").format(product.getPrice()));
try{
if(product.getStock()!=null){
//字符串格式化為int
productDTO.setStock(newDecimalFormat("#個").parse(product.getStock()).intValue());
catch(ParseExceptione){
thrownewRuntimeException(e);
returnproductDTO;
privateDecimalFormatcreateDecimalFormat(StringnumberFormat){
DecimalFormatdf=newDecimalFormat(numberFormat);
df.setParseBigDecimal(true);
returndf;
測試代碼:
@Test
publicvoidtest2(){
com.gotten.study.mapstruct.demo3.Productproduct=newcom.gotten.study.mapstruct.demo3.Product();
product.setProductId("P001");
product.setPrice(newBigDecimal("100"));
product.setStock("1個");
com.gotten.study.mapstruct.demo3.ProductDTOproductDTO=demo3Assembler.toDTO(product);
System.out.println("productDTO:"+JSON.toJSONString(productDTO));
productDTO:{"price":"100.00元","productId":"P001","stock":1}
(2)Date和String之間的轉換,可以通過dateFormat指定轉換格式,使用的是SimpleDateFormat的實現(xiàn)。
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProduct{
privateStringproductId;
privateDatesaleTime;
privateStringvalidTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=-6780322740093464581L;
privateStringproductId;
privateStringsaleTime;
privateDatevalidTime;
}
定義映射器:
@Mapper(componentModel="spring")
publicinterfaceDemo4Assembler{
@Mapping(target="saleTime",dateFormat="yyyy-MM-ddHH:mm:ss")//Date轉換成String
@Mapping(target="validTime",dateFormat="yyyy-MM-ddHH:mm")//String轉換成Date
ProductDTOtoDTO(Productproduct);
}
實現(xiàn)代碼:
@Component
publicclassDemo4AssemblerImplimplementsDemo4Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
if(product.getSaleTime()!=null){
productDTO.setSaleTime(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(product.getSaleTime()));//轉換成String
try{
if(product.getValidTime()!=null){
productDTO.setValidTime(newSimpleDateFormat("yyyy-MM-ddHH:mm").parse(product.getValidTime()));//轉換成Date
catch(ParseExceptione){
thrownewRuntimeException(e);
returnproductDTO;
}
3.3.3屬性為復雜對象的映射
(1)如果是相同類型的對象引用,不會創(chuàng)建新的對象,直接把對象的引用從源對象賦值給目標對象。
(2)如果類型相同,但是是集合類的引用,會創(chuàng)建一個新的集合,集合里面的所有引用進行拷貝。
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
ListSkulist=product.getSkuList();
if(list!=null){
productDTO.setSkuList(newArrayListSku(list));//創(chuàng)建新的集合,并對所有元素進行拷貝
returnproductDTO;
}
(3)對象的類型不同,會檢查映射器中是否存在對應的映射方法,如果存在,直接使用,否則會嘗試自動創(chuàng)建子映射方法。
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProduct{
privateStringproductId;
privateProductDetailproductDetail;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDetail{
privateStringid;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=2184784038009791692L;
privateStringproductId;
privateProductDetailDTOproductDetail;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDetailDTO{
privateStringdetailId;
}
定義映射器:
@Mapper(componentModel="spring")
publicinterfaceDemo6Assembler{
ProductDTOtoDTO(Productproduct);
@Mapping(target="detailId",source="id")
ProductDetailDTOtoDetailDTO(ProductDetaildetail);
}
生成代碼:
@Component
publicclassDemo6AssemblerImplimplementsDemo6Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
productDTO.setProductDetail(toDetailDTO(product.getProductDetail()));//查找使用存在的轉換方法
returnproductDTO;
publicProductDetailDTOtoDetailDTO(ProductDetaildetail){
if(detail==null){
ProductDetailDTOproductDetailDTO=newProductDetailDTO();
productDetailDTO.setDetailId(detail.getId());
returnproductDetailDTO;
}
(4)多層bean之間的轉換
@Mapping注解支持跨層級的屬性轉換,屬性可以在不同層級之間切換。
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProduct{
privateStringproductId;
privateProductDetailproductDetail;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDetail{
privateStringid;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=2184784038009791692L;
privateStringproductId;
privateProductDetailDTOproductDetail;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDetailDTO{
privateStringproductId;
privateStringdetailId;
}
定義映射器:
@Mapper(componentModel="spring")
publicinterfaceDemo7Assembler{
@Mapping(target="productDetail.detailId",source="productDetail.id")//聲明productDetail下的屬性轉換規(guī)則
@Mapping(target="productDductId",source="productId")//跨層級的屬性轉換,把product層級的productId放到productDetail層級
ProductDTOtoDTO(Productproduct);
}
生成代碼:
@Component
publicclassDemo7AssemblerImplimplementsDemo7Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
if(product.getProductDetail()!=null){
if(productDTO.getProductDetail()==null){
productDTO.setProductDetail(newProductDetailDTO());
productDetailToProductDetailDTO(product.getProductDetail(),productDTO.getProductDetail());
if(productDTO.getProductDetail()==null){
productDTO.setProductDetail(newProductDetailDTO());
productToProductDetailDTO(product,productDTO.getProductDetail());
productDTO.setProductId(product.getProductId());
returnproductDTO;
//detail的轉換方法
protectedvoidproductDetailToProductDetailDTO(ProductDetailproductDetail,ProductDetailDTOmappingTarget){
if(productDetail==null){
return;
mappingTarget.setDetailId(productDetail.getId());
//product轉成detail(更新處理)
protectedvoidproductToProductDetailDTO(Productproduct,ProductDetailDTOmappingTarget){
mappingTarget.setProductId(product.getProductId());
}
3.3.4自定義轉換器
MapStruct支持自定義轉換器,實現(xiàn)類型之間的轉換自定義的規(guī)則。
一個自定義映射器可以定義多個映射方法,匹配時,是以方法的入參和出參進行匹配的。如果綁定的映射中,存在多個相同的入參和出參方法,將會報錯。
如果多個入參或者出參方法存在繼承關系,將會匹配最具體的那一個方法。
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProduct{
privateStringproductId;
privateListStringimages;
@Data
@AllArgsConstructor
@NoArgsConstructor
publicclassProductDTOimplementsSerializable{
privatestaticfinallongserialVersionUID=2184784038009791692L;
privateStringproductId;
privateStringimages;
}
定義映射器:
@Component
publicclassImageFormater{
publicStringformat(ListStringimages){
returnString.join(",",images);
}
綁定轉換器:
@Mapper(componentModel="spring",uses=ImageFormater.class)
publicinterfaceDemo8Assembler{
ProductDTOtoDTO(Productproduct);
}
映射器實現(xiàn):
@Component
publicclassDemo8AssemblerImplimplementsDemo8Assembler{
@Autowired
privateImageFormaterimageFormater;
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
//調用自定義的映射器進行映射,把list轉成string
productDTO.setImages(imageFormater.format(product.getImages()));
returnproductDTO;
}
3.3.5使用限定符限定使用轉換方法
自定義轉換器時,存在多個相同入參和出參的方法,MapStruct無法匹配使用哪個映射方法。這時可以使用限定符綁定每個屬性轉換時使用的轉換方法。
(1)限定符使用自定義注解實現(xiàn)。
聲明限定符:
importorg.mapstruct.Qualifier;
//映射器上的限定符
@Qualifier//標記為限定符
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public@interfaceFormators{
//映射方法上的限定符
@Qualifier//標記為限定符
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public@interfaceFormatImages{
//映射方法上的限定符
@Qualifier//標記為限定符
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public@interfaceFormatDetails{
}
綁定限定符到映射器的方法上面:
@Component
@Formators//綁定限定符
publicclassCusFormater{
@FormatImages//綁定限定符
publicStringformatImages(ListStringimages){
returnString.join(",",images);
@FormatDetails//綁定限定符
publicStringformatDetails(ListStringimages){
returnString.join(",",images);
}
映射時,綁定限定符,定位映射方法:
@Mapper(componentModel="spring",uses=CusFormater.class)
publicinterfaceDemo9Assembler{
@Mapping(target="images",qualifiedBy=FormatImages.class)//轉換指定限定符,定位具體的映射方法
@Mapping(target="details",qualifiedBy=FormatDetails.class)//轉換指定限定符,定位具體的映射方法
ProductDTOtoDTO(Productproduct);
}
生成代碼:
@Component
publicclassDemo9AssemblerImplimplementsDemo9Assembler{
@Autowired
privateCusFormatercusFormater;
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
productDTO.setImages(cusFormater.formatImages(product.getImages()));//定位方法
productDTO.setDetails(cusFormater.formatDetails(product.getDetails()));
returnproductDTO;
}
(2)基于named注解實現(xiàn)(推薦)
除了使用自定義注解的方法,還可以使用@Named注解實現(xiàn)限定符的綁定。
@Component
@Named("CusFormater")
publicclassCusFormater{
//綁定限定符
@Named("formatImages")
publicStringformatImages(ListStringimages){
returnString.join(",",images);
//綁定限定符
@Named("formatDetails")
publicStringformatDetails(ListStringimages){
returnString.join(",",images);
}
使用時綁定:
@Mapper(componentModel="spring",uses=CusFormater.class)
publicinterfaceDemo10Assembler{
@Mapping(target="images",qualifiedByName="formatImages")//轉換指定限定符,定位具體的映射方法
@Mapping(target="details",qualifiedByName="formatDetails")//轉換指定限定符,定位具體的映射方法
ProductDTOtoDTO(Productproduct);
}
3.4Map的映射
可以使用@MapMapping實現(xiàn)對key和value的分別映射:
@Mapper(componentModel="spring")
publicinterfaceDemo11Assembler{
@MapMapping(valueDateFormat="yyyy-MM-ddHH:mm:ss")
MapString,StringtoDTO(MapLong,Datemap);
}
3.5枚舉值之間的轉換
MapStruct可以在多個枚舉值之間轉換,使用@ValueMapping注解。
publicenumE1{
E1_1,
E1_2,
E1_3,
publicenumE2{
E2_1,
E2_2,
E2_3,
}
@Mapper(componentModel="spring")
publicinterfaceDemo11Assembler{
@ValueMapping(target="E1_1",source="E2_1")
@ValueMapping(target="E1_2",source="E2_2")
@ValueMapping(target=MappingConstants.NULL,source="E2_3")//轉換成null
E1toDTO(E2e2);
}
生成代碼:
@Component
publicclassDemo11AssemblerImplimplementsDemo11Assembler{
@Override
publicE1toDTO(E2e2){
if(e2==null){
returnnull;
E1e1;
switch(e2){
caseE2_1:e1=E1.E1_1;
break;
caseE2_2:e1=E1.E1_2;
break;
caseE2_3:e1=null;
break;
default:thrownewIllegalArgumentException("Unexpectedenumconstant:"+e2);
returne1;
}
3.6定制Bean生成
使用MapStruct可以使用對象工廠來創(chuàng)建bean,同時也可以更新bean。
定義對象工廠:
publicclassDTOFactory{
publicProductDTOcreateDTO(){
ProductDTOproductDTO=newProductDTO();
productDTO.setStock(0);
returnproductDTO;
}
使用對象工廠:
@Mapper(componentModel="spring",uses=DTOFactory.class)//指定使用的對象工廠
publicinterfaceDemo13Assembler{
ProductDTOtoDTO(Productproduct);
}
生成代碼:
@Component
publicclassDemo13AssemblerImplimplementsDemo13Assembler{
@Autowired
privateDTOFactorydTOFactory;
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=dTOFactory.createDTO();//使用對象工廠創(chuàng)建對象
productDTO.setProductId(product.getProductId());
returnproductDTO;
}
3.7缺省值和常量
MapStruct允許設置缺省值和常量,同時缺省值允許使用表達式。
注意:使用缺省值,源字段必須存在,否則缺省值不生效,否則應該使用常量。
@Mapper(componentModel="spring",imports=UUID.class)
publicinterfaceDemo15Assembler{
@Mapping(target="productId",source="productId",defaultValue="0")//當product的productId為null,設置為0
@Mapping(target="random",source="random",defaultExpression="java(UUID.randomUUID().toString())")//缺省設置隨機數
@Mapping(target="stock",constant="0")//固定設置為0
@Mapping(target="createTime",dateFormat="yyyy-MM-dd",constant="2025-05-30")//固定格式化設置為2025-05-30,
ProductDTOtoDTO(Productproduct);
}
@Component
publicclassDemo15AssemblerImplimplementsDemo15Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
if(product.getProductId()!=null){
productDTO.setRandom(product.getProductId());
else{
productDTO.setRandom(UUID.randomUUID().toString());
if(product.getProductId()!=null){
productDTO.setProductId(product.getProductId());
else{
productDTO.setProductId("0");
productDTO.setStock(0);
try{
productDTO.setCreateTime(newSimpleDateFormat("yyyy-MM-dd").parse("2025-05-30"));
catch(ParseExceptione){
thrownewRuntimeException(e);
returnproductDTO;
}
3.8存在繼承關系的結果處理
當返回的結果類型存在繼承關系時,可以使用@BeanMapping注解指定真實返回的結果類型。
@Mapper(componentModel="spring")
publicinterfaceDemo17Assembler{
@BeanMapping(resultType=DogDTO.class)//指定返回的結果類型
AnimaltoDTO(Dogdog);
}
@Component
publicclassDemo17AssemblerImplimplementsDemo17Assembler{
@Override
publicAnimaltoDTO(Dogdog){
if(dog==null){
returnnull;
DogDTOanimal=newDogDTO();
animal.setId(dog.getId());
returnanimal;
}
3.9映射關系繼承
MapStruct允許對映射關系進行繼承,使用@InheritConfiguration標記當前方法繼承其他映射方法的映射關系。會自動查找相同類型映射源、映射目標的方法進行繼承,如果存在多個相同類型的方法,則需要手工指定。
@Mapper(componentModel="spring")
publicinterfaceDemo18Assembler{
@Mapping(target="productId",source="id")
@Mapping(target="detail",source="detail1")
ProductDTOtoDTO(Productproduct);
@Mapping(target="productId",source="id2")
@Mapping(target="detail",source="detail2")
ProductDTOtoDTO2(Productproduct);
@InheritConfiguration(name="toDTO")//對toDTO的映射關系進行繼承
@Mapping(target="detail",source="detail2")//對繼承的關系進行重寫
voidupdate(@MappingTargetProductDTOproductDTO,Productproduct);
}
除了正向繼承規(guī)則外,還可以進行規(guī)則逆向繼承,從被繼承方法的目標對象映射到源對象。
@Mapper(componentModel="spring")
publicinterfaceDemo18Assembler{
@Mapping(target="productId",source="id")
@Mapping(target="detail",source="detail1")
ProductDTOtoDTO(Productproduct);
@Mapping(target="productId",source="id2")
@Mapping(target="detail",source="detail2")
ProductDTOtoDTO2(Productproduct);
@InheritInverseConfiguration(name="toDTO")//對toDTO的映射關系進行逆繼承
@Mapping(target="detail2",source="detail")//對逆向繼承的關系進行重寫
ProducttoEntity(ProductDTOdto);
}
3.10復雜映射的實現(xiàn)
有時候我們除了普通映射外,還需要進行一些復雜的映射,如把多個字段計算映射成一個字段,或者借用一些工具進行映射的計算等。MapStruct提供了集中方式實現(xiàn)。
3.10.1使用java表達式進行映射
對于復雜的映射,允許使用java表達式實現(xiàn)字段的映射。
注意要導入使用到的類。
@Mapper(componentModel="spring",imports=DecimalUtils.class)//導入java表達式使用的類
publicinterfaceDemo16Assembler{
@Mapping(target="price",expression="java(product.getPrice1()+product.getPrice2())")//直接相加
@Mapping(target="price2",expression="java(DecimalUtils.add(product.getPrice1(),product.getPrice2()))")//使用工具類處理
ProductDTOtoDTO(Productproduct);
}
生成的映射代碼:
@Component
publicclassDemo16AssemblerImplimplementsDemo16Assembler{
@Override
publicProductDTOtoDTO(Productproduct){
if(product==null){
returnnull;
ProductDTOproductDTO=newProductDTO();
productDTO.setProductId(product.getProductId());
productDTO.setPrice(produc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- AISTEAM教學中項目式學習評價與學習成果展示課題報告教學研究課題報告
- 校企合作構建人工智能教育質量監(jiān)控體系研究教學研究課題報告
- 2025年高端無人機研發(fā)生產基地建設規(guī)劃可行性報告
- 全國一等獎統(tǒng)編版語文二年級下冊《古詩二首-詠柳》公開課精美課件
- 2026年生物科技醫(yī)療健康產業(yè)分析報告
- 2025-2026學年廣東深圳紅嶺中學七年級上學期期中考英語試題
- 保險代理人進級制度
- 交警節(jié)假日值班制度
- 兩都巡幸制度
- 2026年泰和縣教育體育局所屬事業(yè)單位競爭性選調工作人員的備考題庫及完整答案詳解1套
- 高校行政管理流程及案例分析
- 《人間充質基質細胞來源細胞外囊泡凍干粉質量要求》(征求意見稿)
- 中潤盛和(孝義)新能源科技 孝義市杜村鄉(xiāng)分散式微風發(fā)電項目可行性研究報告
- 入團申請書教學課件
- 2026年中國農業(yè)銀行秋季校園招聘即將開始考試筆試試題(含答案)
- 2025年江蘇省招聘警務輔助人員考試真題及答案
- 山東濟南2019-2024年中考滿分作文87篇
- (2025年標準)sm調教協(xié)議書
- 醫(yī)院急救應急體系構建與實施
- TCES 109-2022 舌診儀 第一部分:一般要求
- (2025標準)廠房托管協(xié)議書
評論
0/150
提交評論