java之mapstruct的應用


  一、MapStruct是一個代碼生成器,簡化了不同的Java Bean之間映射的處理,所以映射指的就是從一個實體變化成一個實體。例如我們在實際開發中,DAO層的實體和一些數據傳輸對象(DTO),大部分屬性都是相同的,只有少部分的不同,通過mapStruct,可以讓不同實體之間的轉換變的簡單。我們只需要按照約定的方式進行配置即可。

  MapStruct是一個可以處理注解的Java編譯器插件,可以在命令行中使用,也可以在IDE中使用。MapStruct有一些默認配置,但是也為用戶提供了自己進行配置的途徑。

  缺點就是這玩意在使用工具自帶的編譯器是,不會生成實現類,需要通過maven的方式來進行編輯,才會生成實現類,總體上面來說還是很好用的。相對於BeanUtil等,簡介性還是很明顯的。目前MapStruct的版本基本都是固定了,可以自己嘗試着弄一下。

  官方api文檔地址:http://mapstruct.org/documentation/stable/reference/html/

  二、用到MapStruct需要一個依賴包和一個插件(pom.xml的官方配置)

    <dependencies>  
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.2.0.Final</version>
        </dependency>
    </dependencies>
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source> <!-- or higher, depending on your project -->
                    <target>1.8</target> <!-- or higher, depending on your project -->
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.2.0.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

  三、我這里謝了一個簡單的例子供參考

package com.troy.jpa.service.mapper;

import com.troy.jpa.dto.UserDTO;
import com.troy.jpa.entity.User;
import com.troy.jpa.service.util.AgeUtil;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import java.util.List;

@Mapper(componentModel = "spring", uses = {AgeUtil.class})
public interface UserMapper {


    @Mappings({
            @Mapping(source = "age", target = "age", qualifiedByName = {"AgeUtil", "ageAdd"}),
    })
    UserDTO userToDTO(User user);

    @InheritConfiguration
    User DTOToUser(UserDTO userDTO);

    List<UserDTO> userListToDTOList(List<User> users);

}
package com.troy.jpa.service.util;

import org.springframework.stereotype.Component;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

@Component
public class AgeUtil {

    public String ageAdd(String age) throws ScriptException {
        ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine engine = engineManager.getEngineByName("JavaScript");
        Object eval = engine.eval(age + "+1");
        return eval.toString();
    }
}

  說明:

  1)在接口上面加入@Mapper,就可以實現實體和DTO之間的裝換

  2)componentModel 是加入模塊,一般都是spring容器,在實現類中會加入@Component注解

  3)uses引入外部類,用於實體和DTO之間的工具類

  4) 多個@Mapping在@Mappings里面編寫,也可以單個編寫@Mapping。如果實體和DTO之間數據字段一樣,可以不加任何注解

  5)qualifiedByName 的用法,主要是用來轉換特殊數據處理的自定義方式。{}中第一個代表bean,第二種達標方法。

  6)@InheritConfiguration 的用法,也就是反向映射。當source,target字段不一樣,寫第一個。其它的映射可以不用再寫@Mapping,直接加入@InheritConfiguration注解即可

  7)@Mapping 中的ignore 賦值 true可以忽略某個字段(這個主要是在字段相同,但是類型不同,並且不能裝換的時候用)

  四、當然我這里主要是寫的幾種常用的用法,mapstruct中還有其他的寫法,和api我這里不一一介紹。我提到的主要是比較常用的寫法,其他很多方式。可能會用到。但是可以作為自己學習的開始。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM