91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中MapStruct指的是什么

發布時間:2021-06-16 13:45:34 來源:億速云 閱讀:327 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“java中MapStruct指的是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java中MapStruct指的是什么”這篇文章吧。

一、簡介

現在的分布式系統中模塊劃分越來越細,不同模塊的實體、DTO、DO等需要進行轉換,這么多工程處理起來不是那么簡單。

MapStruct 就是這樣的一個屬性映射插件,用于為Java Bean生成類型安全且高性能的映射。它基于編譯階段生成get/set代碼,此實現過程中沒有反射,不會造成額外的性能損失。只需要定義一個 Mapper 接口,MapStruct 就會自動實現這個映射接口,避免了繁瑣的映射實現。

優點

與手工編寫映射代碼相比

  • MapStruct通過生成冗長且容易出錯的代碼來節省時間。

與動態映射框架相比

  • 簡單泛型智能轉換;

  • 效率高:無需手動 set/get 或 implements Serializable 以達到深拷貝;

  • 性能更高:使用簡單的 Java 方法調用代替反射;

  • 編譯時類型安全:只能映射相同名稱或帶映射標記的屬性;

  • 編譯時產生錯誤報告:如果映射不完整(存在未被映射的目標屬性)或映射不正確(找不到合適的映射方法或類型轉換)則會在編譯時拋出異常。

java中MapStruct指的是什么

二、Demo

2.1 導入依賴

使用該插件主要需要導入兩個包:

::: details Maven | Gradle

Maven

<dependency>
        <groupId>org.mapstruct</groupId>
        <!-- jdk8以下就使用mapstruct -->
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.3.0.Final</version>
    </dependency>
				<!-- 注解處理器 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.3.0.Final</version>
    </dependency>

Gradle

plugins {
    ...
    id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse
}

dependencies {
    ...
    compile 'org.mapstruct:mapstruct:1.4.2.Final'

    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
    testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' // if you are using mapstruct in test code
}
...

2.2 示例代碼

::: details domain、vo、mapper、controller

domain/Person.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private Long id;

    private String name;

    private Integer age;

    private Integer sex;

}

vo/PersonVO.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonVO {
    private Long personId;
    private String personName;
    private Integer age;
}

mapper/PersonMapper.java

@Mapper(componentModel = "spring")
public interface PersonMapper {
    /**
     * ClassLoader 的方式獲取當前 mapper (可以不用)
     */
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    /**
     * 實體轉VO
     * source
     * @param person
     * @return PersonVO
     */
    @Mappings({
            @Mapping(source = "id", target = "personId"),
            @Mapping(source = "name", target = "personName")
    })
    PersonVO toPersonVO(Person person);

    /**
     * VO轉實體
     *
     * @param person
     * @return PersonVO
     */
    @Mappings({
            @Mapping(source = "personId", target = "id"),
            @Mapping(source = "personName", target = "name"),
      			@Mapping(target = "sex", ignore = true),
    })
    Person toPerson(PersonVO person);

}

Controller

@RestController
@RequestMapping("/api")
public class TestMapStructController {

    @Autowired
    PersonMapper personMapper;

    @GetMapping("convert")
    public List<Object> convertEntity() {
        ArrayList<Object> objectList = new ArrayList<>();
        Person person = Person.builder()
                .id(5L)
                .name("zhangsan")
                .age(12)
                .sex(1)
                .build();
        objectList.add(person);

        PersonVO personVO = personMapper.toPersonVO(person);
        Person person1 = personMapper.toPerson(personVO);
        objectList.add("person 轉 personVO" + personVO);
        objectList.add("personVO 轉 person" + person1);
        return objectList;
    }
}

打包后會看見 mapstruct 為我們生成了 mapper 的實現類

java中MapStruct指的是什么 

三、 注解介紹

@Mapper :MapStruct 注解處理器會掃描這個注解

先介紹一下 @Mapper 注解的 componentModel 屬性,該屬性用于自動生成的接口實現類的組件類型,這個屬性支持四個值:

1.default : 這是默認的情況,mapstruct 不使用任何組件類型, 可以通過Mappers.getMapper(Class)方式獲取自動生成的實例對象。

2.cdi : 生成的映射器是一個應用程序范圍的 CDI bean,可以通過 @Inject 檢索

3.spring : 生成的實現類上面會自動添加一個@Component注解,可以通過Spring的 @Autowired方式進行注入

4.jsr330 : 生成的實現類上會添加@javax.inject.Named 和@Singleton注解,可以通過 @Inject注解獲取

@Mappings:配置多個@Mapping

@Mapping 屬性映射,若源對象屬性與目標對象名字一致,會自動映射對應屬性

1.source :參數類的屬性

2.target :要轉換的類的屬性

3.ignore :配合 target 使用,表示改轉換類的的屬性不需要映射

4.expression :配合 target 使用,表示改轉換類的的屬性使用指定的表達式進行轉換

@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

5.expression :配合 target 使用,表示改轉換類的的屬性使用指定的表達式進行轉換

@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

以上是“java中MapStruct指的是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安龙县| 于田县| 赣榆县| 同德县| 遵化市| 灯塔市| 苏尼特左旗| 金昌市| 东乌珠穆沁旗| 抚松县| 台安县| 榆林市| 武城县| 克什克腾旗| 青海省| 广州市| 新巴尔虎左旗| 马公市| 上蔡县| 峨眉山市| 屏南县| 麻城市| 米脂县| 布拖县| 彝良县| 桂平市| 偃师市| 乐陵市| 睢宁县| 吉林市| 深水埗区| 九龙城区| 电白县| 鄢陵县| 土默特左旗| 巩留县| 岑溪市| 玉龙| 赤壁市| 庄浪县| 瑞安市|