Java中MapStruct的使用詳解
mapstruct概述
mapstruct,全稱是org.mapstruct.Mapper, 是將接口或抽象類標記為映射器,并通過MapStruct為這個接口或者抽象類生成一個實現(xiàn)類,大大簡化了Java bean類型之間轉(zhuǎn)換
在維護一個新項目時,突然發(fā)現(xiàn)了,項目中一個新奇的點,就說關(guān)于MapStruct的使用,因為關(guān)于值傳遞映射,從最初的手動映射,到后來的工具類. 對于MapStruct使用較少,故整理記錄一下該使用說明
優(yōu)點:
- mapstruct是在編譯時完成Bean轉(zhuǎn)換,
- 和傳統(tǒng)相比,提升了服務(wù)性能
- 編譯后在target目錄,生成對應(yīng)的xxximp.java文件,方便定位問題
缺點:
- 必須添加一個接口或者抽象類,才能實現(xiàn)映射
mapstruct案例
依賴在spring環(huán)境中使用,通過編譯打包發(fā)現(xiàn),會生成對應(yīng)接口的實現(xiàn)類.
1 添加依賴
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency>
2 添加實體對象和DTO
實體對象
@Data @NoArgsConstructor @AllArgsConstructor public class User { private String id; private String name; private Date crateTime; }
Dto對象
@Data @NoArgsConstructor @AllArgsConstructor public class UserDto { private String userId; private String userName; private Date beginTime; }
3 添加接口
/** * componentModel 制定模式spring 將bean交給spring管理 * unmappedTargetPolicy ignore 目標屬性未匹配時系統(tǒng)忽略,不打印警告日志 */ @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE ) public interface UserMapper { //靜態(tài)成員 UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); // 單個書寫 // 常量 @Mapping(source = "id", target = "userId",constant = "可以指定常量") // 默認值 @Mapping(source = "name", target = "userName", defaultValue = "可以指定默認值") // 日期轉(zhuǎn)換 @Mapping(source = "crateTime", target = "beginTime", dateFormat = "yyyy-MM-dd HH:mm:ss") UserDto userToUserDto(User user); // 批量寫法 與上述二選一 @Mappings({ // Integer 到 String的轉(zhuǎn)換 @Mapping(source = "id", target = "numId" ,numberFormat = "$#.00"), @Mapping(source = "name", target = "userName"), //Date 轉(zhuǎn)字符串 @Mapping(source = "crateTime", target = "crtTime", dateFormat = "dd.MM.yyyy"), // 使用java可執(zhí)行代碼或函數(shù) @Mapping(target = "crateTime", expression = "java(java.time.LocalDateTime.now()") }) UserDto userToUserDto2(User user); // 批量轉(zhuǎn)換,循環(huán)調(diào)用上面單個轉(zhuǎn)換 List<UserDto> userToUserDtoList(List<User> users); }
4 通過Maven命令,編譯打包項目,發(fā)現(xiàn)target對應(yīng)包下面,生成了一個UserMapperImpl.class文件.
@Component public class UserMapperImpl implements UserMapper { public UserMapperImpl() { } @Override public UserDto userToUserDto(User user) { if (user == null){ return null; }else{ UserDto userDto = new UserDto(); user.setId(user.getId()); user.setName(user.getName()); user.setCrateTime(user.getCrateTime()); return userDto; } } @Override public List<UserDto> userToUserDtoList(List<User> users) { if (users == null){ return null; }else{ List<UserDto> list = new ArrayList<>(users.size()); Iterator var3 = users.iterator(); while (var3.hasNext()){ User user = (User) var3.next(); list.add(this.userToUserDto(user)); } return list; } } }
mapstruct總結(jié)
通過mapstruct的使用發(fā)現(xiàn),和之前工具類的映射有很多不同.
不過其工作定位在,實體對象,Dto,Bo等對象在不通層級的轉(zhuǎn)換,可以通過默認值,常量值,java代碼和函數(shù),比較靈活多變.
到此這篇關(guān)于Java中MapStruct的使用詳解的文章就介紹到這了,更多相關(guān)MapStruct的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中MapStruct使用方法解析
- Java中的MapStruct知識點總結(jié)
- Java中的MapStruct的使用方法代碼實例
- Java中的MapStruct實現(xiàn)詳解
- Java中MapStruct入門使用及對比
- Java高效映射工具MapStruct的使用示例
- Java中MapStruct映射處理器報錯的問題解決
- Java高性能實體類轉(zhuǎn)換工具MapStruct的使用教程詳解
- SpringBoot中MapStruct實現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
- MapStruct升級遇到的問題及解決方案
相關(guān)文章
Spring?Boot?3.1中整合Spring?Security和Keycloak的方法
本文介紹在最新的SpringBoot3.1版本之下,如何將Keycloak和Spring?Security一起跑起來,文中結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-06-06區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實現(xiàn)常規(guī)操作的方法
這篇文章主要介紹了區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實現(xiàn)常規(guī)操作,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Java基本數(shù)據(jù)類型與對應(yīng)的包裝類(動力節(jié)點java學(xué)院整理)
Java是面向?qū)ο蟮木幊陶Z言,包裝類的出現(xiàn)更好的體現(xiàn)這一思想,Java語言提供了八種基本類型。六種數(shù)字類型(四個整數(shù)型,兩個浮點型),一種字符類型,還有一種布爾型。 下面通過本文給大家詳細介紹,感興趣的朋友一起學(xué)習(xí)吧2017-04-04SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置
這篇文章主要為大家介紹了SpringBoot2.7中WebSecurityConfigurerAdapter類過期應(yīng)該如何配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06