一、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我這里不一一介紹。我提到的主要是比較常用的寫法,其他很多方式。可能會用到。但是可以作為自己學習的開始。