欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

MapStruct優(yōu)雅的對(duì)象轉(zhuǎn)換解決方案是什么樣的

MapStruct優(yōu)雅的對(duì)象轉(zhuǎn)換解決方案是什么樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的成都西信服務(wù)器托管服務(wù)

第一次看到 MapStruct 的時(shí)候, 我個(gè)人非常的開心。因?yàn)槠涓覂?nèi)心里面的想法不謀而合。

1 MapStruct 是什么?

1.1 JavaBean 的困擾

對(duì)于代碼中 JavaBean之間的轉(zhuǎn)換, 一直是困擾我很久的事情。

在開發(fā)的時(shí)候我看到業(yè)務(wù)代碼之間有很多的 JavaBean 之間的相互轉(zhuǎn)化, 非常的影響觀感, 卻又不得不存在。我后來(lái)想的一個(gè)辦法就是通過(guò)反射, 或者自己寫很多的轉(zhuǎn)換器。

第一種通過(guò)反射的方法確實(shí)比較方便, 但是現(xiàn)在無(wú)論是 BeanUtils, BeanCopier 等在使用反射的時(shí)候都會(huì)影響到性能。雖然我們可以進(jìn)行反射信息的緩存來(lái)提高性能。

但是像這種的話, 需要類型和名稱都一樣才會(huì)進(jìn)行映射, 有很多時(shí)候, 由于不同的團(tuán)隊(duì)之間使用的名詞不一樣, 還是需要很多的手動(dòng) set/get 等功能。

第二種的話就是會(huì)很浪費(fèi)時(shí)間, 而且在添加新的字段的時(shí)候也要進(jìn)行方法的修改。不過(guò), 由于不需要進(jìn)行反射, 其性能是很高的。

1.2 MapStruct 帶來(lái)的改變

MapSturct 是一個(gè)生成類型安全, 高性能且無(wú)依賴的 JavaBean 映射代碼的注解處理器(annotation processor)。

抓一下重點(diǎn):

  1. 注解處理器

  2. 可以生成 JavaBean 之間那的映射代碼

  3. 類型安全, 高性能, 無(wú)依賴性

從字面的理解, 我們可以知道, 該工具可以幫我們實(shí)現(xiàn) JavaBean之間的轉(zhuǎn)換, 通過(guò)注解的方式。

同時(shí), 作為一個(gè)工具類,相比于手寫, 其應(yīng)該具有便捷, 不容易出錯(cuò)的特點(diǎn)。

2 MapStruct 入門

入門很簡(jiǎn)單。我是基于 Maven 來(lái)進(jìn)行項(xiàng)目 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 創(chuàng)建entity和dto對(duì)象

該類是從 github 某個(gè)訂單系統(tǒng)里面拿下來(lái)的部分。

@Data
public class Order {

    /**
     *訂單id
     */
    private Long id;

    /**
     * 訂單編號(hào)
     */
    private String orderSn;

    /**
     * 收貨人姓名/號(hào)碼
     */
    private String receiverKeyword;

    /**
     * 訂單狀態(tài):0->待付款;1->待發(fā)貨;2->已發(fā)貨;3->已完成;4->已關(guān)閉;5->無(wú)效訂單
     */
    private Integer status;

    /**
     * 訂單類型:0->正常訂單;1->秒殺訂單
     */
    private Integer orderType;

    /**
     * 訂單來(lái)源:0->PC訂單;1->app訂單
     */
    private Integer sourceType;
}

對(duì)應(yīng)的查詢參數(shù)

@Data
public class OrderQueryParam {
    /**
     * 訂單編號(hào)
     */
    private String orderSn;

    /**
     * 收貨人姓名/號(hào)碼
     */
    private String receiverKeyword;

    /**
     * 訂單狀態(tài):0->待付款;1->待發(fā)貨;2->已發(fā)貨;3->已完成;4->已關(guān)閉;5->無(wú)效訂單
     */
    private Integer status;

    /**
     * 訂單類型:0->正常訂單;1->秒殺訂單
     */
    private Integer orderType;

    /**
     * 訂單來(lái)源:0->PC訂單;1->app訂單
     */
    private Integer sourceType;

}

2.3 寫 Mapper

Mapper 即映射器, 一般來(lái)說(shuō)就是寫 xxxMapper 接口。

當(dāng)然, 不一定是以 Mapper 結(jié)尾的。只是官方是這么寫的。在本入門例子中,對(duì)應(yīng)的接口如下

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);

}

簡(jiǎn)單的映射(字段和類型都匹配), 只有一個(gè)要求, 在接口上寫 @Mapper 注解即可。

然后方法上, 入?yún)?duì)應(yīng)要被轉(zhuǎn)化的對(duì)象, 返回值對(duì)應(yīng)轉(zhuǎn)化后的對(duì)象, 方法名稱可任意。

2.4 測(cè)試

寫一個(gè)測(cè)試類測(cè)試一下。

@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());

}

測(cè)試通過(guò), 沒(méi)有任何的問(wèn)題。

3 MapStruct 分析

上面中, 我寫了3個(gè)步驟來(lái)實(shí)現(xiàn)了從 OrderOrderQueryParam 的轉(zhuǎn)換。

那么, 作為一個(gè)注解處理器, 通過(guò)MapStruct 生成的代碼具有怎么樣的優(yōu)勢(shì)呢?

3.1 高性能

這是相對(duì)反射來(lái)說(shuō)的, 反射需要去讀取字節(jié)碼的內(nèi)容, 花銷會(huì)比較大。學(xué)反射看《Java反射看這篇絕對(duì)會(huì)了》這篇夠了!關(guān)注公眾號(hào)Java技術(shù)??梢蚤喿x更多Java技術(shù)干貨教程。

而通過(guò) MapStruct 來(lái)生成的代碼, 其類似于人手寫。速度上可以得到保證。

前面例子中生成的代碼可以在編譯后看到。在 target/generated-sources/annotations 里可以看到。

MapStruct優(yōu)雅的對(duì)象轉(zhuǎn)換解決方案是什么樣的

生成的代碼

對(duì)應(yīng)的代碼

@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;
    }
}

可以看到其生成了一個(gè)實(shí)現(xiàn)類, 而代碼也類似于我們手寫, 通俗易懂。

3.2 易于 debug

在我們生成的代碼中, 我們可以輕易的進(jìn)行 debug。

MapStruct優(yōu)雅的對(duì)象轉(zhuǎn)換解決方案是什么樣的

易于 DEBUG

在使用反射的時(shí)候, 如果出現(xiàn)了問(wèn)題, 很多時(shí)候是很難找到是什么原因的。

3.3 使用相對(duì)簡(jiǎn)單

如果是完全映射的, 使用起來(lái)肯定沒(méi)有反射簡(jiǎn)單。用類似 BeanUtils 這些工具一條語(yǔ)句就搞定了。但是,如果需要進(jìn)行特殊的匹配(特殊類型轉(zhuǎn)換, 多對(duì)一轉(zhuǎn)換等), 其相對(duì)來(lái)說(shuō)也是比較簡(jiǎn)單的。

基本上, 使用的時(shí)候, 我們只需要聲明一個(gè)接口, 接口下寫對(duì)應(yīng)的方法, 就可以使用了。當(dāng)然, 如果有特殊情況, 是需要額外處理的。

3.4 代碼獨(dú)立

生成的代碼是對(duì)立的, 沒(méi)有運(yùn)行時(shí)的依賴。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

本文標(biāo)題:MapStruct優(yōu)雅的對(duì)象轉(zhuǎn)換解決方案是什么樣的
文章網(wǎng)址:http://chinadenli.net/article24/jsipce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、標(biāo)簽優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站維護(hù)、靜態(tài)網(wǎng)站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
久久精品中文字幕人妻中文| 日韩人妻毛片中文字幕| 国产综合欧美日韩在线精品| 欧美日韩国产综合在线| 国产精品亚洲综合天堂夜夜| 熟妇人妻av中文字幕老熟妇| 九九蜜桃视频香蕉视频| 欧美色婷婷综合狠狠爱| 开心五月激情综合婷婷色| 欧美一级片日韩一级片| 国产91人妻精品一区二区三区| 青青操日老女人的穴穴| 日韩三极片在线免费播放| 色婷婷国产熟妇人妻露脸| 日本高清不卡一二三区| 黑人巨大精品欧美一区二区区| 99久久精品午夜一区二| 亚洲国产性感美女视频| 日韩欧美好看的剧情片免费| 国产亚洲欧美日韩精品一区| 国产免费观看一区二区| 日本人妻中出在线观看| 欧美精品久久男人的天堂| 久久成人国产欧美精品一区二区 | 人妻久久一区二区三区精品99| 欧美人妻少妇精品久久性色| 国产日韩欧美在线播放| 日韩精品在线观看完整版| 欧美日韩国产亚洲三级理论片 | 国产成人精品午夜福利av免费| 初尝人妻少妇中文字幕在线| 色好吊视频这里只有精| 日本不卡一区视频欧美| 日韩一区二区三区嘿嘿| 91人人妻人人爽人人狠狠| 久久精品国产一区久久久| 国产成人精品一区二区三区| 夜色福利久久精品福利| 欧美一区二区在线日韩| 亚洲日本韩国一区二区三区| 后入美臀少妇一区二区|