Java中MapStruct的使用詳解
mapstruct概述
mapstruct,全稱是org.mapstruct.Mapper, 是將接口或抽象類標(biāo)記為映射器,并通過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),就說關(guān)于MapStruct的使用,因?yàn)殛P(guān)于值傳遞映射,從最初的手動(dòng)映射,到后來的工具類. 對(duì)于MapStruct使用較少,故整理記錄一下該使用說明
優(yōu)點(diǎn):
- mapstruct是在編譯時(shí)完成Bean轉(zhuǎn)換,
- 和傳統(tǒng)相比,提升了服務(wù)性能
- 編譯后在target目錄,生成對(duì)應(yīng)的xxximp.java文件,方便定位問題
缺點(diǎn):
- 必須添加一個(gè)接口或者抽象類,才能實(shí)現(xiàn)映射
mapstruct案例
依賴在spring環(huán)境中使用,通過編譯打包發(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è)書寫
// 常量
@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);
// 批量寫法 與上述二選一
@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 通過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é)
通過mapstruct的使用發(fā)現(xiàn),和之前工具類的映射有很多不同.
不過其工作定位在,實(shí)體對(duì)象,Dto,Bo等對(duì)象在不通層級(jí)的轉(zhuǎn)換,可以通過默認(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入門使用及對(duì)比
- Java高效映射工具M(jìn)apStruct的使用示例
- Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決
- Java高性能實(shí)體類轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解
- SpringBoot中MapStruct實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
- MapStruct升級(jí)遇到的問題及解決方案
相關(guān)文章
Spring?Boot?3.1中整合Spring?Security和Keycloak的方法
本文介紹在最新的SpringBoot3.1版本之下,如何將Keycloak和Spring?Security一起跑起來,文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-06-06
解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問題
下面小編就為大家分享一篇解決maven啟動(dòng)Spring項(xiàng)目報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實(shí)現(xiàn)常規(guī)操作的方法
這篇文章主要介紹了區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實(shí)現(xiàn)常規(guī)操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
解決調(diào)試JDK源碼時(shí),不能查看變量的值問題
下面小編就為大家?guī)硪黄鉀Q調(diào)試JDK源碼時(shí),不能查看變量的值問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
Java基本數(shù)據(jù)類型與對(duì)應(yīng)的包裝類(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
Java是面向?qū)ο蟮木幊陶Z言,包裝類的出現(xiàn)更好的體現(xiàn)這一思想,Java語言提供了八種基本類型。六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型),一種字符類型,還有一種布爾型。 下面通過本文給大家詳細(xì)介紹,感興趣的朋友一起學(xué)習(xí)吧2017-04-04
SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置
這篇文章主要為大家介紹了SpringBoot2.7中WebSecurityConfigurerAdapter類過期應(yīng)該如何配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

