Javaテクノロジスタック
www.javastack.cn
より質の高い記事を読むためにフォロー
初めて見MapStruct
た時は個人的にとても嬉しいです。それは私の内面の考えと一致するからです。
1 MapStructとは何ですか?
1.1 JavaBeanの問題
間のコード変換については、長い間私を悩ませてきました。JavaBean
開発中に
、影響の非常に知覚間の相互変換のビジネスの間に多くのコードが表示されましたが、存在しなければなりませんでした。後で考えた方法の1つは、リフレクションを使用するか、自分で多くのコンバーターを作成することでした。JavaBean
リフレクションを使用する最初の方法は確かに便利ですがBeanUtils
、BeanCopier
リフレクションを使用するとパフォーマンスが影響を受けます。パフォーマンスを向上させるためにリフレクション情報をキャッシュできますが。
ただし、この場合、タイプと名前のマッピングは同じである必要があります。多くの場合、異なるチームで使用される名詞は異なるため、多くの手動のset / get関数が依然として必要です。
2番目のタイプは時間の浪費であり、新しいフィールドを追加するときにメソッドを変更する必要があります。ただし、反射が不要なため、性能は非常に高いです。
1.2 MapStruct
もたらされた変化
MapSturct
これは、タイプセーフ、高性能、依存関係のないJavaBeanマッピングコードを生成する注釈プロセッサ(注釈プロセッサ)です。
重要なポイントを把握します。
注釈プロセッサ
JavaBean
コード間のマッピングが生成される可能性がありますタイプセーフ、高性能、依存性なし
文字通りの理解から、私たちは知ることができます。このツールは
、コメントによって、それらの間の変換を達成するのに役立ちます。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つの手順を書いた変換を。Order
OrderQueryParam
では、注釈プロセッサとして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でロジックを書いたが、同僚はそれを直接理解できなかった
3. Tomcatをぶら下げて、Undertowのパフォーマンスは非常に爆発的です!!
4. スプリングブートは残酷です。一度に3つのバージョンをリリースしてください。
5. Spring BootはどのようにしてRedisを迅速に統合しますか?
7. Spring Boot Redisは分散ロックを実装しています。
8. 中国人は小さくて完全なJavaツールライブラリをオープンソース化しました!
9. 中国のオープンソースは非常に使いやすいRedisクライアントです。!
QRコードをスキャンして、Java Technology Stackの公式アカウントをフォローし、より多くのドライグッズを読んでください。