Java中MapStruct的使用詳解
mapstruct概述
mapstruct,全稱是org.mapstruct.Mapper, 是將接口或抽象類標(biāo)記為映射器,并通過(guò)MapStruct為這個(gè)接口或者抽象類生成一個(gè)實(shí)現(xiàn)類,大大簡(jiǎn)化了Java bean類型之間轉(zhuǎn)換
在維護(hù)一個(gè)新項(xiàng)目時(shí),突然發(fā)現(xiàn)了,項(xiàng)目中一個(gè)新奇的點(diǎn),就說(shuō)關(guān)于MapStruct的使用,因?yàn)殛P(guān)于值傳遞映射,從最初的手動(dòng)映射,到后來(lái)的工具類. 對(duì)于MapStruct使用較少,故整理記錄一下該使用說(shuō)明
優(yōu)點(diǎn):
- mapstruct是在編譯時(shí)完成Bean轉(zhuǎn)換,
- 和傳統(tǒng)相比,提升了服務(wù)性能
- 編譯后在target目錄,生成對(duì)應(yīng)的xxximp.java文件,方便定位問(wèn)題
缺點(diǎn):
- 必須添加一個(gè)接口或者抽象類,才能實(shí)現(xiàn)映射
mapstruct案例
依賴在spring環(huán)境中使用,通過(guò)編譯打包發(fā)現(xiàn),會(huì)生成對(duì)應(yīng)接口的實(shí)現(xiàn)類.
1 添加依賴
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>2 添加實(shí)體對(duì)象和DTO
實(shí)體對(duì)象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String id;
private String name;
private Date crateTime;
}Dto對(duì)象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private String userId;
private String userName;
private Date beginTime;
}3 添加接口
/**
* componentModel 制定模式spring 將bean交給spring管理
* unmappedTargetPolicy ignore 目標(biāo)屬性未匹配時(shí)系統(tǒng)忽略,不打印警告日志
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface UserMapper {
//靜態(tài)成員
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
// 單個(gè)書(shū)寫(xiě)
// 常量
@Mapping(source = "id", target = "userId",constant = "可以指定常量")
// 默認(rèn)值
@Mapping(source = "name", target = "userName", defaultValue = "可以指定默認(rèn)值")
// 日期轉(zhuǎn)換
@Mapping(source = "crateTime", target = "beginTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
UserDto userToUserDto(User user);
// 批量寫(xiě)法 與上述二選一
@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)用上面單個(gè)轉(zhuǎn)換
List<UserDto> userToUserDtoList(List<User> users);
}4 通過(guò)Maven命令,編譯打包項(xiàng)目,發(fā)現(xiàn)target對(duì)應(yīng)包下面,生成了一個(gè)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é)
通過(guò)mapstruct的使用發(fā)現(xiàn),和之前工具類的映射有很多不同.
不過(guò)其工作定位在,實(shí)體對(duì)象,Dto,Bo等對(duì)象在不通層級(jí)的轉(zhuǎn)換,可以通過(guò)默認(rèn)值,常量值,java代碼和函數(shù),比較靈活多變.
到此這篇關(guān)于Java中MapStruct的使用詳解的文章就介紹到這了,更多相關(guān)MapStruct的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中MapStruct使用方法解析
- Java中的MapStruct知識(shí)點(diǎn)總結(jié)
- Java中的MapStruct的使用方法代碼實(shí)例
- Java中的MapStruct實(shí)現(xiàn)詳解
- Java中MapStruct入門(mén)使用及對(duì)比
- Java高效映射工具M(jìn)apStruct的使用示例
- Java中MapStruct映射處理器報(bào)錯(cuò)的問(wèn)題解決
- Java高性能實(shí)體類轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解
- SpringBoot中MapStruct實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
- MapStruct升級(jí)遇到的問(wèn)題及解決方案
相關(guān)文章
Springboot mybatis-plus配置及用法詳解
這篇文章主要介紹了Springboot mybatis-plus配置及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java項(xiàng)目中實(shí)現(xiàn)使用traceId跟蹤請(qǐng)求全流程日志
這篇文章主要介紹了Java項(xiàng)目中實(shí)現(xiàn)使用traceId跟蹤請(qǐng)求全流程日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java如何通過(guò)反射機(jī)制獲取數(shù)據(jù)類對(duì)象的屬性及方法
文章介紹了如何使用Java反射機(jī)制獲取類對(duì)象的所有屬性及其對(duì)應(yīng)的get、set方法,以及如何通過(guò)反射機(jī)制實(shí)現(xiàn)類對(duì)象的實(shí)例化,感興趣的朋友跟隨小編一起看看吧2025-01-01
詳細(xì)聊聊RabbitMQ竟無(wú)法反序列化List問(wèn)題
這篇文章主要給大家介紹了關(guān)于RabbitMQ竟無(wú)法反序列化List的相關(guān)資料,文中通過(guò)示例代碼將問(wèn)題以及解決的過(guò)程介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
java8 LocalDate LocalDateTime等時(shí)間類用法實(shí)例分析
這篇文章主要介紹了java8 LocalDate LocalDateTime等時(shí)間類用法,結(jié)合具體實(shí)例形式分析了LocalDate、LocalTime、LocalDateTime等日期時(shí)間相關(guān)類的功能與具體使用技巧,需要的朋友可以參考下2017-04-04
SpringBoot實(shí)現(xiàn)國(guó)際化i18n詳解
國(guó)際化(Internationalization,簡(jiǎn)稱i18n)是指在軟件應(yīng)用中支持多種語(yǔ)言和文化的能力,本文將介紹如何在Spring?Boot應(yīng)用中實(shí)現(xiàn)國(guó)際化,需要的可以參考下2024-12-12
總結(jié)十個(gè)實(shí)用但偏執(zhí)的Java編程技術(shù)
Java是世界上最流行的程序語(yǔ)言,從1995年問(wèn)世以來(lái),Java的生態(tài)系統(tǒng)在一直在蓬勃的發(fā)展著。下面這篇文章主要總結(jié)了十個(gè)實(shí)用但偏執(zhí)的Java編程技術(shù),需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01

