SpringBoot + MapStruct 屬性映射工具的使用詳解
1. MapStruct 是什么?

截取下官方的原話 我給翻譯了一下 說白了 當(dāng)你的對象A有幾十個屬性 而另一個對象B 與A比較只有一些細微的差別
那么這時候只需要映射過去即可 而不需要瘋狂的調(diào)用set方法 進行屬性的拷貝 這就是這個工具給我們帶來的最大便利
官方github鏈接 點擊跳轉(zhuǎn)
2. 引入依賴
采用Mapstruct的 最新版本 1.4.2.Final
SpringBoot版本不要選新版的 我對比了下 2.3.0 和 2.5.4 后者會出現(xiàn)屬性映射為null的情況
已經(jīng)將問題反饋了 具體不知道是和原因 所以先用老版本吧
下面的插件最好與我的保持一致 否則會導(dǎo)致一些問題
<properties>
<java.version>1.8</java.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<!-- 引入 mapstruct-processor -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<!-- 引入 lombok-processor -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
3.當(dāng)兩個對象屬性完全相同時 User 類
新建 User 類 隨便加點屬性進去
@Data
@Accessors(chain = true)
public class User {
private String name;
private String password;
private String money;
}
UserVo 類
再新建一個我們需要拷貝過去的對象 UserVo 屬性完全相同
@Data
@Accessors(chain = true)
public class UserVo {
private String name;
private String password;
private String money;
}
轉(zhuǎn)換接口 UserConvert
@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
//默認寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
UserVo convert(User user);
}
我們將代碼編譯一下 在 target目錄下 找到對應(yīng)的實現(xiàn)類 UserConvertImpl
可以發(fā)現(xiàn)他其實就是將對應(yīng)的屬性設(shè)置到了 Vo對象中罷了 只不過這是自動生成的
public class UserConvertImpl implements UserConvert {
public UserConvertImpl() {
}
public UserVo convert(User user) {
if (user == null) {
return null;
} else {
UserVo userVo = new UserVo();
userVo.setName(user.getName());
userVo.setPassword(user.getPassword());
userVo.setMoney(user.getMoney());
return userVo;
}
}
}
測試屬性賦值
在對應(yīng)的測試類里 轉(zhuǎn)化打印
@Test
void contextLoads() {
User user = new User().setName("爆爆").setPassword("123").setMoney("500");
UserVo userVo = UserConvert.INSTANCE.convert(user);
System.out.println(userVo);
}
打印結(jié)果如下
UserVo(name=爆爆, password=123, money=500)
4. 當(dāng)對象屬性有所差別時 UserVo2
對應(yīng)的User 不變 新增 一個 UserVo2
將原先的name改成了UserName
@Data
@Accessors(chain = true)
public class UserVo2 {
//name--->userName
private String userName;
private String password;
private String money;
}
這時候我們要將User的屬性值直接賦予 其實是不會報錯的 只不過name不會映射給UserName 而已
修改轉(zhuǎn)換類
@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
//默認寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
UserVo convert(User user);
//新增一個方法
UserVo2 convert2(User user);
}
再次測試
@Test
void contextLoads() {
User user = new User().setName("爆爆").setPassword("123").setMoney("500");
UserVo2 userVo2 = UserConvert.INSTANCE.convert2(user);
System.out.println(userVo2);
}
打印結(jié)果
UserVo2(userName=null, password=123, money=500)
如果要要將 name 賦值給 userName 其實也很簡單 操作如下
新增 @Mappings 與@Mapping注解 指明對應(yīng)哪個屬性賦值給哪個就可以了
@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
//默認寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
UserVo convert(User user);
@Mappings({
//對應(yīng) source指向的是User targer指向的是UserVo2
@Mapping(source = "name",target = "userName")
})
UserVo2 convert2(User user);
}
再次運行測試類
打印結(jié)果 發(fā)現(xiàn)沒有問題
UserVo2(userName=爆爆, password=123, money=500)
5. IDEA插件
mapstrut有對應(yīng)的idea插件 其實我覺得作用一般吧 還是放上吧

由于自己研究的也不多 暫時寫到這里
我們執(zhí)著于那些遺憾,并非那些事情有多重要,而是那些時光里的自己,是真誠坦率且可愛的,也許這才是我們執(zhí)著的意義。
到此這篇關(guān)于SpringBoot + MapStruct 屬性映射工具的使用的文章就介紹到這了,更多相關(guān)SpringBoot屬性映射工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaSwing FlowLayout 流式布局的實現(xiàn)
這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
IDEA報錯:Process terminated的問題及解決
這篇文章主要介紹了IDEA報錯:Process terminated的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

