mapstruct 快速使用

mapstruct 主要的作用则是用来复制对象字段使用,功能非常的强大。在没有使用 mapstruct 之前可能都在使用 BeanUtils ,但是 BeanUtils 其实问题比较多,只能处理同类型的字段并且同名称的字段,对于复杂的情况没有办法处理,其实就是 BeanUtils 使用的反射,性能较差。而 mapstruct 使用的是传统的 setter 与 getter 方式,只需要提供接口在编译的时候会生成相应的实现。

1. 添加依赖

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</dependency>

2. 简单的情况处理

下面的代码中为了缩小代码量,使用了 lombok 相关注解。

2.1 定义 User

@Data
@Builder
public class User {
private String name; private Date createTime;
}

2.2 定义 UserDto

@Data
@Builder
public class UserDto {
private String name; private String sex; // 故意多了一个sex private String createTime;
}

2.3 定义 Converter,其实就是 Mapper

此 Mapper 不是 Mybatis 的 Mapper ,是 Mapstruct 的 Mapper(org.mapstruct.Mapper)。

@Mapper
public interface UserConverter {
UserConverter INSTANCE = Mappers.getMapper(UserConverter.class); UserDto toUserDto(User user);
}

2.4 测试一下

public class Main {
public static void main(String[] args) {
User user = User.builder().name("张三").createTime(new Date()).build();
UserDto userDto = UserConverter.INSTANCE.toUserDto(user);
System.out.println(userVO);
}
}

执行后,会在 target/classes 对应的包中会产生一个 UserConverterImpl.class 内容反编译后如下:

public class UserConverterImpl implements UserConverter {
public UserConverterImpl() {
} public UserDto toUserDto(User user) {
if (user == null) {
return null;
} else {
UserDtoBuilder userDto = UserDto.builder();
userDto.name(user.getName());
userDto.createTime(user.getCreateTime());
return userDto.build();
}
}
}

3. 复杂的情况处理

复杂的情况,可能有相同字段但是不同的类型,也有可能是相同类型但是名称不同,或者是在处理的过程中需要调用一些方法进行处理等。

3.1 定义 UserComplex

@Data
@Builder
public class UserComplex {
private String name; private Integer status; private Date createTime;
}

3.2 定义 UserComplexDto

@Data
@Builder
public class UserComplexDto {
private String userName; //在UserComplex中叫name private String status; //在UserComplex中是Integer类型 private String createTime; //在UserComplex中是Date类型
}

3.3 定义 Converter,其实就是 Mapper

@Mapper
public interface UserComplexConverter {
UserComplexConverter INSTANCE = Mappers.getMapper(UserComplexConverter.class); @Mappings({
@Mapping(target = "createTime",dateFormat="yyyy-MM-dd HH:mm")
})
UserComplexDto toUserComplexDto1(UserComplex user); @Mappings({
@Mapping(target = "userName",source = "name"),
@Mapping(target = "status",expression = "java(java.lang.String.valueOf(user.getStatus()))"),
@Mapping(target = "createTime",dateFormat="yyyy-MM-dd HH:mm")
})
UserComplexDto toUserComplexDto2(UserComplex user);
}

3.4 测试一下

public class Main {
public static void main(String[] args) {
UserComplex user = UserComplex.builder().name("张三").status(10).createTime(new Date()).build();
UserComplexDto userVO = UserComplexConverter.INSTANCE.toUserComplexDto2(user);
System.out.println(userVO);
}
}

输入内容如下:

UserComplexDto(userName=null, status=10, createTime=2020-09-18 16:14)
UserComplexDto(userName=张三, status=10, createTime=2020-09-18 16:14)

在使用 toUserComplexDto1 方法处理时,因为我们指定了 @Mappings 处理不匹配的字段,这里只指定了 createTime,实际上他也给我们处理了 status。但是名称不匹配的他就不知道处理了,这也是正常的,肯定不知道如何匹配呀。

在使用 toUserComplexDto2 方法处理时,这一次通过 @Mappings 将所有的字段都明确指定了,显然都处理成功了。

注意:在使用 mapstruct 的时候,如果有类型不匹配,你没有显示的指定 @Mappings,那么会报错,如果你显示的指定了一个,其余的他也会以默认的处理方式处理。

本文主要用于个人记录笔记!

mapstruct 快速使用的更多相关文章

  1. spring boot 之使用mapstruct

    最近在阅读swagger源码,当看到 springfox.documentation.swagger2.mappers.ModelMapper 类时,无意中看到该类上面使用的 org.mapstruc ...

  2. 对象拷贝 - 优雅的解决方案 Mapstruct

    MapStruct GitHub 访问地址 : https://github.com/mapstruct/mapstruct/ 使用例子 : https://github.com/mapstruct/ ...

  3. 优雅的对象转换解决方案-MapStruct使用进阶(二)

    在前面, 介绍了 MapStruct 及其入门. 本文则是进一步的进阶. 在 MapStruct 生成对应的实现类的时候, 有如下的几个情景. 1 属性名称相同,则进行转化 在实现类的时候, 如果属性 ...

  4. spring-boot-plus是易于使用,快速,高效,功能丰富,开源的spring boot 脚手架.

    Everyone can develop projects independently, quickly and efficiently! spring-boot-plus是一套集成spring bo ...

  5. 丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!

    在前几天的文章<为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?>中,我曾经对几款属性拷贝的工具类进行了对比. 然后在评论区有些读者反馈说MapStruct才是真 ...

  6. MapStruct 解了对象映射的毒

    前言 MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao.分层的结构下,各层之间的数据传输要求就会存在差异,我们不能用一个对象来 ...

  7. 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  8. 常用开发库 - MapStruct工具库详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  9. 【工具库】Java实体映射工具MapStruct

    一.什么是MapStruct? MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和 Apache ...

随机推荐

  1. Anaconda简介及特点

    摘要 Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以在Linux.macOS以及Windows系统中搭建环境并使用,其编写的代码在不同平台上运行时,几乎不需要做较 ...

  2. 灵活使用 SQLAlchemy 中的 ORM 查询

    之前做查询一直觉得直接拼 SQL 比较方便,用了 SQLAlchemy 的 ORM 查询之后,发现也还可以,还提高了可读性. 这篇文章主要说说 SQLAlchemy 常用的 ORM 查询方式,偏实践. ...

  3. 用 Java 做个“你画手机猜”的小游戏

    本文适合有 Java 基础的人群 作者:DJL-Lanking HelloGitHub 推出的<讲解开源项目>系列.有幸邀请到了亚马逊 + Apache 的工程师:Lanking( htt ...

  4. DC4靶机

    DC-4靶机渗透 扫描内网机器,看到143是开启的,那么ok了,确定了目标主机的地址. 对其进行进一步的端口扫描,80,22端口都是开放的. 访问具体网页,进行爆破,分别为admin,happy. 里 ...

  5. Combine 框架,从0到1 —— 5.Combine 中的 Subjects

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 中的 Subjects. 内容概览 前言 PassthroughSubject C ...

  6. ABP+WorkflowCore+jsplumb实现工作流

    前言 ABP目前已经是很成熟的开发框架了,它提供了很多我们日常开发所必须的功能,并且很方便扩展,让我们能更专注于业务的开发.但是ABP官方并没有给我们实现工作流. 在.net core环境下的开源工作 ...

  7. 海量数据分库分表方案(二)技术选型与sharding-jdbc实现

    上一章已经讲述分库分表算法选型,本章主要讲述分库分表技术选型 文中关联上一章,若下文出现提及其时,可以点击 分库分表算法方案与技术选型(一) 主要讲述 框架比较 sharding-jdbc.zdal ...

  8. Python-序列反转和序列反转协议-reversed __reversed__

    reversed 将序列反转,依次把最后的元素放到第一个位置,把第一元素放到最后一个位置,变成生成器对象 name = "beimenchuixue" print(next(rev ...

  9. html 网页美化--2

    html网页美化: 鼠标点击特效:爱心.爆炸烟花(有些特效在Chrome中无法实现,推荐使用edge) 背景樱花花瓣 鼠标滑动彩带 此代码也可以用于博客园主页美化(需要申请JS权限):复制到博客侧边栏 ...

  10. MacOS下Terminal获取GPS经纬度坐标

    通过命令行直接获取经纬度坐标MacOS 首先下载WhereAmI,最新版本: https://github.com/robmathers/WhereAmI/releases/download/v1.1 ...