Java中的MapStruct用法詳解_第1頁
Java中的MapStruct用法詳解_第2頁
Java中的MapStruct用法詳解_第3頁
Java中的MapStruct用法詳解_第4頁
Java中的MapStruct用法詳解_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論