SpringBoot + MapStruct 屬性映射工具的使用詳解
1. MapStruct 是什么?
截取下官方的原話 我給翻譯了一下 說白了 當(dāng)你的對(duì)象A有幾十個(gè)屬性 而另一個(gè)對(duì)象B 與A比較只有一些細(xì)微的差別
那么這時(shí)候只需要映射過去即可 而不需要瘋狂的調(diào)用set方法 進(jìn)行屬性的拷貝 這就是這個(gè)工具給我們帶來的最大便利
官方github鏈接 點(diǎn)擊跳轉(zhuǎn)
2. 引入依賴
采用Mapstruct的 最新版本 1.4.2.Final
SpringBoot
版本不要選新版的 我對(duì)比了下 2.3.0
和 2.5.4
后者會(huì)出現(xiàn)屬性映射為null的情況
已經(jīng)將問題反饋了 具體不知道是和原因 所以先用老版本吧
下面的插件最好與我的保持一致 否則會(huì)導(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)兩個(gè)對(duì)象屬性完全相同時(shí) User 類
新建 User
類 隨便加點(diǎn)屬性進(jìn)去
@Data @Accessors(chain = true) public class User { private String name; private String password; private String money; }
UserVo 類
再新建一個(gè)我們需要拷貝過去的對(duì)象 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 { //默認(rèn)寫法 調(diào)用getMapper 獲取對(duì)應(yīng)的實(shí)體類 編譯后會(huì)生成對(duì)應(yīng)的實(shí)現(xiàn)類 UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); UserVo convert(User user); }
我們將代碼編譯一下 在 target
目錄下 找到對(duì)應(yīng)的實(shí)現(xiàn)類 UserConvertImpl
可以發(fā)現(xiàn)他其實(shí)就是將對(duì)應(yīng)的屬性設(shè)置到了 Vo對(duì)象中罷了 只不過這是自動(dòng)生成的
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; } } }
測試屬性賦值
在對(duì)應(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)對(duì)象屬性有所差別時(shí) UserVo2
對(duì)應(yīng)的User
不變 新增 一個(gè) UserVo2
將原先的name改成了UserName
@Data @Accessors(chain = true) public class UserVo2 { //name--->userName private String userName; private String password; private String money; }
這時(shí)候我們要將User的屬性值直接賦予 其實(shí)是不會(huì)報(bào)錯(cuò)的 只不過name
不會(huì)映射給UserName
而已
修改轉(zhuǎn)換類
@Mapper// 注意 這里的注解是org.mapstruct包下的 public interface UserConvert { //默認(rèn)寫法 調(diào)用getMapper 獲取對(duì)應(yīng)的實(shí)體類 編譯后會(huì)生成對(duì)應(yīng)的實(shí)現(xiàn)類 UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); UserVo convert(User user); //新增一個(gè)方法 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 其實(shí)也很簡單 操作如下
新增 @Mappings
與@Mapping
注解 指明對(duì)應(yīng)哪個(gè)屬性賦值給哪個(gè)就可以了
@Mapper// 注意 這里的注解是org.mapstruct包下的 public interface UserConvert { //默認(rèn)寫法 調(diào)用getMapper 獲取對(duì)應(yīng)的實(shí)體類 編譯后會(huì)生成對(duì)應(yīng)的實(shí)現(xiàn)類 UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); UserVo convert(User user); @Mappings({ //對(duì)應(yīng) source指向的是User targer指向的是UserVo2 @Mapping(source = "name",target = "userName") }) UserVo2 convert2(User user); }
再次運(yùn)行測試類
打印結(jié)果 發(fā)現(xiàn)沒有問題
UserVo2(userName=爆爆, password=123, money=500)
5. IDEA插件
mapstrut有對(duì)應(yīng)的idea插件 其實(shí)我覺得作用一般吧 還是放上吧
由于自己研究的也不多 暫時(shí)寫到這里
我們執(zhí)著于那些遺憾,并非那些事情有多重要,而是那些時(shí)光里的自己,是真誠坦率且可愛的,也許這才是我們執(zhí)著的意義。
到此這篇關(guān)于SpringBoot + MapStruct 屬性映射工具的使用的文章就介紹到這了,更多相關(guān)SpringBoot屬性映射工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaSwing FlowLayout 流式布局的實(shí)現(xiàn)
這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12IDEA報(bào)錯(cuò):Process terminated的問題及解決
這篇文章主要介紹了IDEA報(bào)錯(cuò):Process terminated的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11淺談Java變量賦值運(yùn)算符及相關(guān)實(shí)例
這篇文章主要介紹了Java賦值運(yùn)算符的一些知識(shí),需要的朋友可以參考下。2017-09-09