mapstruct 快速使用
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 快速使用的更多相关文章
- spring boot 之使用mapstruct
		最近在阅读swagger源码,当看到 springfox.documentation.swagger2.mappers.ModelMapper 类时,无意中看到该类上面使用的 org.mapstruc ... 
- 对象拷贝 - 优雅的解决方案 Mapstruct
		MapStruct GitHub 访问地址 : https://github.com/mapstruct/mapstruct/ 使用例子 : https://github.com/mapstruct/ ... 
- 优雅的对象转换解决方案-MapStruct使用进阶(二)
		在前面, 介绍了 MapStruct 及其入门. 本文则是进一步的进阶. 在 MapStruct 生成对应的实现类的时候, 有如下的几个情景. 1 属性名称相同,则进行转化 在实现类的时候, 如果属性 ... 
- spring-boot-plus是易于使用,快速,高效,功能丰富,开源的spring boot 脚手架.
		Everyone can develop projects independently, quickly and efficiently! spring-boot-plus是一套集成spring bo ... 
- 丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
		在前几天的文章<为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?>中,我曾经对几款属性拷贝的工具类进行了对比. 然后在评论区有些读者反馈说MapStruct才是真 ... 
- MapStruct 解了对象映射的毒
		前言 MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao.分层的结构下,各层之间的数据传输要求就会存在差异,我们不能用一个对象来 ... 
- 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解
		常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ... 
- 常用开发库 - MapStruct工具库详解
		常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ... 
- 【工具库】Java实体映射工具MapStruct
		一.什么是MapStruct? MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和 Apache ... 
随机推荐
- 关于bat脚本中的命令状态码相关的%errorlevel%变量
			bat脚本中常用%errorlevel%表达上一条命令的返回值,即命令执行状态码.也称命令退出码 一般上一条命令的执行结果返回的值只有两种,0和非0 (如常见的1,2,4,5,9009等等),0一般会 ... 
- 趣图:调试bug进行时
			扩展阅读 趣图:大神写实,左脚程序继续运行,右脚程序调试 趣图:Bug 多了,总有一个会把你坑了 趣图:领导在旁,只求代码无Bug 
- IDEA搭建多模块maven项目
			目录 新建maven项目作为多模块的parent项目 新建模块 在parent项目中配置 pom api 模块搭建restful风格api Mybatis Generator的使用(mybatis 逆 ... 
- 注解在Spring中的运用(对象获取、对象单例/多例、值的注入、初始化/销毁方法、获取容器)
			1.注解的方式获取对象 (1)导包: (2)书写配置文件(要保证已经导入了约束): <?xml version="1.0" encoding="UTF-8" ... 
- WPF启动流程-自己手写Main函数
			WPF一般默认提供一个MainWindow窗体,并在App.Xaml中使用StartupUri标记启动该窗体.以下通过手写实现WPF的启动. 首先先介绍一下VS默认提供的App.Xaml的结构,如下图 ... 
- centos 启动 elasticsearch 失败集
			环境: elasticsearch 6.5.2, java 连接失败 启动后当你 使用 curl http://localhost:9200 测试时,得到如下结果 Curl: (7) Failed c ... 
- 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)
			为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ... 
- 微服务通信之feign的注册、发现过程
			前言 feign 是目前微服务间通信的主流方式,是springCloud中一个非常重要的组件.他涉及到了负载均衡.限流等组件.真正意义上掌握了feign可以说就掌握了微服务. 一.feign的使用 f ... 
- 决策树防止过拟合(预剪枝(Pre-Pruning))
			预剪枝(Pre-Pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点. 
- 基础篇:深入解析JAVA注解机制
			目录 java实现注解的底层原理和概念 五种元注解详解 使用动态代理机制处理注解 spring.AOP和注解机制 (题外)@FunctionalInterface原理介绍 欢迎指正文中错误 关注公众号 ... 
