まだBeanUtilsを使用していますか?エレガントなオブジェクト変換ソリューションであるMapStructをお試しください!

Javaテクノロジスタック

www.javastack.cn

より質の高い記事を読むためにフォロー

初めて見MapStructた時は個人的にとても嬉しいです。それは私の内面の考えと一致するからです。

1 MapStructとは何ですか?

1.1 JavaBeanの問題

JavaBean間のコード変換については、長い間私を悩ませてきました。

開発中にJavaBean、影響の非常に知覚間相互変換のビジネスの間に多くのコードが表示されましたが、存在しなければなりませんでした。後で考えた方法の1つは、リフレクションを使用するか、自分で多くのコンバーターを作成することでした。

リフレクションを使用する最初の方法は確かに便利ですがBeanUtilsBeanCopierリフレクションを使用するとパフォーマンスが影響を受けます。パフォーマンスを向上させるためにリフレクション情報をキャッシュできますが。

ただし、この場合、タイプと名前のマッピングは同じである必要があります。多くの場合、異なるチームで使用される名詞は異なるため、多くの手動のset / get関数が依然として必要です。

2番目のタイプは時間の浪費であり、新しいフィールドを追加するときにメソッドを変更する必要があります。ただし、反射が不要なため、性能は非常に高いです。

1.2 MapStructもたらされた変化

MapSturctこれは、タイプセーフ、高性能、依存関係のないJavaBeanマッピングコードを生成する注釈プロセッサ(注釈プロセッサ)です。

重要なポイントを把握します。

  1. 注釈プロセッサ

  2. JavaBeanコード間のマッピングが生成される可能性があります

  3. タイプセーフ、高性能、依存性なし

文字通りの理解から、私たちは知ることができます。このツールはJavaBean、コメントによって、それらの間の変換を達成するのに役立ちます

同時に、ツールとしては、手書きよりも便利で、エラーが発生しにくいはずです。

2 MapStructはじめに

始めるのは簡単です。私はMavenプロジェクト管理パッケージjar をベースとしていました。

2.1依存関係の紹介

<properties>
        <org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
</properties>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

2.2エンティティとdtoオブジェクトを作成する

このクラスは、githubの特定の注文システムから取得されます。

@Data
public class Order {

    /**
     *订单id
     */
    private Long id;

    /**
     * 订单编号
     */
    private String orderSn;

    /**
     * 收货人姓名/号码
     */
    private String receiverKeyword;

    /**
     * 订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
     */
    private Integer status;

    /**
     * 订单类型:0->正常订单;1->秒杀订单
     */
    private Integer orderType;

    /**
     * 订单来源:0->PC订单;1->app订单
     */
    private Integer sourceType;
}

対応するクエリパラメータ

@Data
public class OrderQueryParam {
    /**
     * 订单编号
     */
    private String orderSn;

    /**
     * 收货人姓名/号码
     */
    private String receiverKeyword;

    /**
     * 订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
     */
    private Integer status;

    /**
     * 订单类型:0->正常订单;1->秒杀订单
     */
    private Integer orderType;

    /**
     * 订单来源:0->PC订单;1->app订单
     */
    private Integer sourceType;


}

2.3書き込みマッパー

Mapperそのマッパーは、一般的に、xxxMapperインターフェースを書くことです。

もちろん、これでMapper終わりではありませんそれは単なる公式の執筆です。この紹介例では、対応するインターフェースは次のとおりです。

import com.homejim.mapstruct.dto.OrderQueryParam;
import com.homejim.mapstruct.entity.Order;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface OrderMapper {

    OrderQueryParam entity2queryParam(Order order);

}

単純なマッピング(フィールドと一致のタイプ)は、インターフェース@Mapperアノテーションに書き込むためのリクエストを1つだけ持つことができます。

次に、メソッドでは、入力パラメーターは変換されるオブジェクトに対応し、戻り値は変換されたオブジェクトに対応します。メソッド名は任意です。

2.4テスト

それをテストするテストクラスを記述します。

@Test
public void entity2queryParam() {
    Order order = new Order();
    order.setId(12345L);
    order.setOrderSn("orderSn");
    order.setOrderType(0);
    order.setReceiverKeyword("keyword");
    order.setSourceType(1);
    order.setStatus(2);

    OrderMapper mapper = Mappers.getMapper(OrderMapper.class);
    OrderQueryParam orderQueryParam = mapper.entity2queryParam(order);
    assertEquals(orderQueryParam.getOrderSn(), order.getOrderSn());
    assertEquals(orderQueryParam.getOrderType(), order.getOrderType());
    assertEquals(orderQueryParam.getReceiverKeyword(), order.getReceiverKeyword());
    assertEquals(orderQueryParam.getSourceType(), order.getSourceType());
    assertEquals(orderQueryParam.getStatus(), order.getStatus());

}

テストは問題なく合格しました。

3 MapStruct分析

上記の、私はから達成するための3つの手順を書いた変換を。OrderOrderQueryParam

では、注釈プロセッサとしてMapStruct、生成されたコードにはどのような利点がありますか?

3.1高性能

これは、バイトコードの内容を読み取る必要があるリフレクションに関連しており、コストが高くなります。リフレクションを学び、「Javaリフレクション、私は間違いなくこれを見るでしょう」この記事で十分です!公開番号のJavaテクノロジースタックをフォローして、Javaテクノロジーの乾物チュートリアルをさらに読んでください。

介してMapStruct人間の手と同様であり、生成されたコードへ。スピードは保証できます。

前の例で生成されたコードは、コンパイル後に確認できます。target / generated-sources / annotationsで確認できます。

生成されたコード

対応するコード

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2019-08-02T00:29:49+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 11.0.2 (Oracle Corporation)"
)
public class OrderMapperImpl implements OrderMapper {

    @Override
    public OrderQueryParam entity2queryParam(Order order) {
        if ( order == null ) {
            return null;
        }

        OrderQueryParam orderQueryParam = new OrderQueryParam();

        orderQueryParam.setOrderSn( order.getOrderSn() );
        orderQueryParam.setReceiverKeyword( order.getReceiverKeyword() );
        orderQueryParam.setStatus( order.getStatus() );
        orderQueryParam.setOrderType( order.getOrderType() );
        orderQueryParam.setSourceType( order.getSourceType() );

        return orderQueryParam;
    }
}

実装クラスが生成され、コードは手書きの文字に似ており、理解しやすいことがわかります。

3.2デバッグが簡単

生成したコードでは、簡単にデバッグできます。

デバッグが簡単

リフレクションを使用する場合、問題があると原因を特定することが難しい場合があります。

3.3比較的使いやすい

それが完全にマッピングされている場合、それは間違いなくリフレクションほど単純ではありません。同様のBeanUtilsツールを使用してステートメントを取得します。ただし、特別なマッチング(特別な型変換、多対1変換など)が必要な場合は、比較的簡単です。

基本的に、それを使用する場合は、インターフェースを宣言し、インターフェースの下に対応するメソッドを記述するだけで使用できます。もちろん、特別な事情がある場合は、追加の処理が必要になります。

3.4コードの独立性

生成されたコードは逆で、実行時の依存関係はありません。

著者:インテークデスク

出典:https://www.cnblogs.com/homejim/

この記事の著作権は著者とブログガーデンに属します。転載を歓迎しますが、著者の同意なしにこの声明を保持し、元のリンクを記事ページの明確な場所に記載する必要があります。そうでない場合、法的責任を追う権利が留保されます。

最近の人気記事:

1. Java 8でロジックを書いたが、同僚はそれを直接理解できなかった

2. スプリングブート研究ノート、これは完成しすぎです!

3. Tomcatをぶら下げて、Undertowのパフォーマンスは非常に爆発的です!

4. スプリングブートは残酷です。一度に3つのバージョンをリリースしてください。

5. Spring BootはどのようにしてRedisを迅速に統合しますか?

6、「Java開発マニュアル(松山版)」の最新版

7. Spring Boot Redisは分散ロックを実装しています。

8. 中国人は小さくて完全なJavaツールライブラリをオープンソース化しました

9. 中国のオープンソースは非常に使いやすいRedisクライアントです。

10、同僚が隠れたバグを書いて、3日間チェックしました!

QRコードをスキャンしてJava Technology Stackの公式アカウントをフォローし、より多くのドライグッズを読んでください。

オリジナルを読むクリックして、インタビューの質問の完全なリストを取得してください

おすすめ

転載: blog.csdn.net/youanyyou/article/details/108413778