1. MapStruct 是什么?
截取下官方的原話 我給翻譯了一下 說白了 當你的對象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)將問題反饋了 具體不知道是和原因 所以先用老版本吧
下面的插件最好與我的保持一致 否則會導致一些問題
<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.當兩個對象屬性完全相同時 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 獲取對應的實體類 編譯后會生成對應的實現(xiàn)類 UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); UserVo convert(User user); }
我們將代碼編譯一下 在 target
目錄下 找到對應的實現(xiàn)類 UserConvertImpl
可以發(fā)現(xiàn)他其實就是將對應的屬性設置到了 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; } } }
測試屬性賦值
在對應的測試類里 轉(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. 當對象屬性有所差別時 UserVo2
對應的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 獲取對應的實體類 編譯后會生成對應的實現(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
注解 指明對應哪個屬性賦值給哪個就可以了
@Mapper// 注意 這里的注解是org.mapstruct包下的 public interface UserConvert { //默認寫法 調(diào)用getMapper 獲取對應的實體類 編譯后會生成對應的實現(xiàn)類 UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); UserVo convert(User user); @Mappings({ //對應 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有對應的idea插件 其實我覺得作用一般吧 還是放上吧
由于自己研究的也不多 暫時寫到這里
我們執(zhí)著于那些遺憾,并非那些事情有多重要,而是那些時光里的自己,是真誠坦率且可愛的,也許這才是我們執(zhí)著的意義。
到此這篇關(guān)于SpringBoot + MapStruct 屬性映射工具的使用的文章就介紹到這了,更多相關(guān)SpringBoot屬性映射工具內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_44353507/article/details/120330720