mapstruct

4475 ワード

MapStructの構成
これまでの準備作業はほとんど終わりませんでしたが、次はMapStructを使用するように構成します.最終的な目的は、カスタムDTOエンティティを返すことです.では、このDTOを作成します.DTOのコードは次のようになります.
package com.yuqiyu.chapter30.dto;

import lombok.Data;

/**
 *   Dto
 */
@Data
public class GoodInfoDTO
{
    //    
    private String goodId;
    //    
    private String goodName;
    //    
    private double goodPrice;
    //    
    private String typeName;
}

GoodInfoDTOエンティティ内に商品情報、商品タイプの2つのテーブル内のデータが統合されていることがわかります.情報が検索された後、MapStructを使用してGoodInfoDTOに自動的にマッピングする必要があります.
Mapperの作成
Mapperという定義は一般にMyBatis半自動化ORMフレームワークに広く応用されているが,ここでのMapperはMybatisとは関係ない.次に、次のコードを見てみましょう.
package com.yuqiyu.chapter30.mapper;

import com.yuqiyu.chapter30.bean.GoodInfoBean;
import com.yuqiyu.chapter30.bean.GoodTypeBean;
import com.yuqiyu.chapter30.dto.GoodInfoDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

/**
 *     
 */
@Mapper(componentModel = "spring")
//@Mapper
public interface GoodInfoMapper
{
    //public static GoodInfoMapper MAPPER = Mappers.getMapper(GoodInfoMapper.class);

    @Mappings({
            @Mapping(source = "type.name",target = "typeName"),
            @Mapping(source = "good.id",target = "goodId"),
            @Mapping(source = "good.title",target = "goodName"),
            @Mapping(source = "good.price",target = "goodPrice")
    })
    public GoodInfoDTO from(GoodInfoBean good, GoodTypeBean type);
}

GoodInfoMapperはインタフェースの形式で存在することがわかります.もちろん抽象クラスでもあります.変換時に個性的なカスタマイズが必要な場合は抽象クラスを採用することができます.対応するコード構成の公式ドキュメントが宣言されています.@Mapper注記は、注釈インタフェースに使用され、抽象クラスはMapStructによって自動的にマッピングされる識別子であり、この注記が存在する場合にのみ内部のインタフェースメソッドが自動的に実装される.MapStructは私たちに多くのMapperを取得する方法を提供してくれて、比較的によく使われている2つはそれぞれ
デフォルト設定
デフォルトの構成では、あまり多くの構成内容を行う必要はありません.Mapperを取得する方法は、動的ファクトリ内部反射メカニズムを使用してMapper実装クラスの取得を完了することです.デフォルトで取得するMapperは次のようになります.
//Mapper      
public static GoodInfoMapper MAPPER = Mappers.getMapper(GoodInfoMapper.class);

//    
GoodInfoMapper.MAPPER.from(goodBean,goodTypeBean);

Spring方式の構成
Spring方式@Mapper注記にcomponentModel属性値を追加する必要があります.構成後、外部で@Autowired方式でMapperを注入してクラス完了マッピング方法呼び出しを実現できます.Spring方式取得Mapperは以下のようになります.
//    
@Mapper(componentModel = "spring")

//  Mapper   
@Autowired
private GoodInfoMapper goodInfoMapper;

//  
goodInfoMapper.from(goodBean,goodTypeBean);

@Mappings & @Mapping
一連の注釈マッピング@Mappingおよび@MappingsがMapperインタフェース定義メソッドに宣言されていますが、この2つの注釈はどのような作業に使用されますか?@Mapping注記source、targetの2つのプロパティを使用しました
sourceはマッピングインタフェースメソッド内のパラメータ名を表す、基本タイプのパラメータであればパラメータ名を直接sourceの内容とすることができ、エンティティタイプであればエンティティパラメータ名を用いることができる.フィールド名の方式はソースの内容として、上のGoodInfoMapperの内容のように構成されています.
targetはメソッドメソッド値にマッピングされたフィールド名を表し、上記のGoodInfoMapperに示すように構成されています.
Mapperインプリメンテーションの表示
次に、maven compileコマンドを実行し、target/generated-sources/annotationsディレクトリの下に対応するMapperインプリメンテーションクラスを表示します.インプリメンテーションクラスコードは次のとおりです.
package com.yuqiyu.chapter30.mapper;

import com.yuqiyu.chapter30.bean.GoodInfoBean;
import com.yuqiyu.chapter30.bean.GoodTypeBean;
import com.yuqiyu.chapter30.dto.GoodInfoDTO;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2017-08-20T12:52:52+0800",
    comments = "version: 1.2.0.CR1, compiler: javac, environment: Java 1.8.0_111 (Oracle Corporation)"
)
@Component
public class GoodInfoMapperImpl implements GoodInfoMapper {

    @Override
    public GoodInfoDTO from(GoodInfoBean good, GoodTypeBean type) {
        if ( good == null && type == null ) {
            return null;
        }

        GoodInfoDTO goodInfoDTO = new GoodInfoDTO();

        if ( good != null ) {
            if ( good.getId() != null ) {
                goodInfoDTO.setGoodId( String.valueOf( good.getId() ) );
            }
            goodInfoDTO.setGoodName( good.getTitle() );
            goodInfoDTO.setGoodPrice( good.getPrice() );
        }
        if ( type != null ) {
            goodInfoDTO.setTypeName( type.getName() );
        }

        return goodInfoDTO;
    }
}


MapStructは、私たちが構成した@Mapping注記に基づいて、自動的にsourceエンティティ内のフィールドをtargetエンティティ内のフィールドを呼び出すsetXxxメソッドを割り当て、すべてのパラメータ検証を行いました.Spring方式でMapperを取得し,自動生成実装クラスでMapStructが@ComponentSpring宣言式注入注記構成を自動的に追加した.