Java中MapStruct的使用詳解
mapstruct概述
mapstruct,全稱是org.mapstruct.Mapper, 是將接口或抽象類標(biāo)記為映射器,并通過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 目標(biāo)屬性未匹配時系統(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-02
Java基本數(shù)據(jù)類型與對應(yīng)的包裝類(動力節(jié)點java學(xué)院整理)
Java是面向?qū)ο蟮木幊陶Z言,包裝類的出現(xiàn)更好的體現(xiàn)這一思想,Java語言提供了八種基本類型。六種數(shù)字類型(四個整數(shù)型,兩個浮點型),一種字符類型,還有一種布爾型。 下面通過本文給大家詳細介紹,感興趣的朋友一起學(xué)習(xí)吧2017-04-04
SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置
這篇文章主要為大家介紹了SpringBoot2.7中WebSecurityConfigurerAdapter類過期應(yīng)該如何配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

