Java MapStruct 字段映射工具类

2024-05-03 11:04
文章标签 java 工具 映射 mapstruct

本文主要是介绍Java MapStruct 字段映射工具类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • MapStruct 字段映射工具类
        • 1、MapStruct官网
        • 2、MapStruct的使用场景
        • 3、MapStruct的使用
          • A.需要进行转换的实体类
          • B.引入依赖
          • C.定义一个做映射的接口
          • D.测试代码
        • 4、MapStruct处理字段映射
          • A.名字不一致时的映射
          • B.可以自动映射的类型
          • C.自定义常量
          • D. 类型不匹配时的映射
        • 5、MapStruct的性能

MapStruct 字段映射工具类

1、MapStruct官网

MapStruct官网
MapStruct官网示例
Mapstruct是一种代码生成器,它极大地简化了基于"约定优于配置"方法的Java bean类型之间映射
的实现。生成的映射代码使用纯方法调用,因此快速、类型安全且易于理解。

约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数
量,获得简单的好处,而又不失灵活性。
2、MapStruct的使用场景

主要用于处理不同业务分层中产生的实体类如在数据存储层,使用DO来抽象一个业务实体;在业务
逻辑层,使用DTO来表示数据传输对象;到了展示层,又把对象封装成VO来与前端进行交互。字段
相差不大而定义了多重类。通过使用get/set方法进行取值赋值。

personDTO.setName(personDO.getName());
personDTO.setAge(personDO.getAge());
personDTO.setSex(personDO.getSex());
personDTO.setBirthday(personDO.getBirthday());
3、MapStruct的使用
A.需要进行转换的实体类
public class PersonDO {private Integer id;private String name;private int age;private Date birthday;private String gender;}public class PersonDTO {private String userName;private Integer age;private Date birthday;private Gender gender;
}
B.引入依赖
...
<properties><org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
</properties>
...<dependencies><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version><scope>provided</scope></dependency>
</dependencies>

因为MapStruct需要在编译器生成转换代码,所以需要在maven-compiler-plugin插件中配置上对
mapstruct-processor的引用。

C.定义一个做映射的接口

使用注解@Mapper定义一个Converter接口,在其中定义一个do2dto方法,方法的入参类型是
PersonDO,出参类型是PersonDTO,这个方法就用于将PersonDO转成PersonDTO。

@Mapper
interface PersonConverter {PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);@Mappings(@Mapping(source = "name", target = "userName"))PersonDTO do2dto(PersonDO person);
}
D.测试代码
public static void main(String[] args) {PersonDO personDO = new PersonDO();personDO.setName("Fcant");personDO.setAge(18);personDO.setBirthday(new Date());personDO.setId(1);personDO.setGender(Gender.MALE.name());PersonDTO personDTO = PersonConverter.INSTANCE.do2dto(personDO);System.out.println(personDTO);
}

输出结果:

PersonDTO{userName='Fcant', age=18, birthday=Sat Aug 08 19:00:44 CST 2020, gender=MALE}
4、MapStruct处理字段映射

要转换的两个类中源对象属性与目标对象属性的类型和名字一致的时候,会自动映射对应属性。

A.名字不一致时的映射

在PersonDO中用name表示用户名称,而在PersonDTO中使用userName表示用户名。
这时候就要使用@Mapping注解了,只需要在方法签名上,使用该注解,并指明需要转换的源对象
的名字和目标对象的名字就可以了,如将name的值映射给userName,可以使用如下方式:

@Mapping(source = "name", target = "userName")
B.可以自动映射的类型

MapStruct会对部分类型自动做映射,不需要做额外配置。
一般情况下,对于以下情况可以做自动类型转换:

  • 基本类型及其包装类型。

  • 基本类型的包装类型和String类型之间

  • String类型和枚举类型之间

C.自定义常量

在转换映射过程中,给一些属性定义一个固定的值,这个时候可以使用 constant

@Mapping(source = "name", constant = "Fcant")
D. 类型不匹配时的映射
public class PersonDO {private String name;private String address;
}
public class PersonDTO {private String userName;private HomeAddress address;
}
@Mapper
interface PersonConverter {PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);@Mapping(source = "userName", target = "name")@Mapping(target = "address",expression = "java(homeAddressToString(dto2do.getAddress()))")PersonDO dto2do(PersonDTO dto2do);default String homeAddressToString(HomeAddress address){return JSON.toJSONString(address);}
}

只需要在PersonConverter中在定义一个方法(因为PersonConverter是一个接口,所以在JDK 1.8以后的版本中可以定义一个default方法),这个方法的作用就是将HomeAddress转换成String类型。

default方法:Java 8 引入的新的语言特性,用关键字default来标注,被default所标注的方法,需要提供实现,而子类可以选择实现或者不实现该方法

然后在dto2do方法上,通过以下注解方式即可实现类型的转换:

@Mapping(target = "address",expression = "java(homeAddressToString(dto2do.getAddress()))")

上面这种是自定义的类型转换,还有一些类型的转换是MapStruct本身就支持的,如String和Date之间的转换:

@Mapping(target = "birthday",dateFormat = "yyyy-MM-dd HH:mm:ss")@Mapping(target = "birthday",dateFormat = "yyyy-MM-dd HH:mm:ss")
5、MapStruct的性能

MapStruct在编译时生成bean映射,这确保了高性能,可以提前将问题反馈出来,也使得开发人员可以彻底的错误检查。
在代码中使用了很多MapStruct提供的注解,这使得在编译期,MapStruct就可以直接生成bean映射的代码,相当于MapStruct写了很多setter和getter。
如在代码中定义了以下一个Mapper

@Mapper
interface PersonConverter {PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);@Mapping(source = "userName", target = "name")@Mapping(target = "address",expression = "java(homeAddressToString(dto2do.getAddress()))")@Mapping(target = "birthday",dateFormat = "yyyy-MM-dd HH:mm:ss")PersonDO dto2do(PersonDTO dto2do);default String homeAddressToString(HomeAddress address){return JSON.toJSONString(address);}
}

经过代码编译后,会自动生成一个PersonConverterImpl:

@Generated(value = "org.mapstruct.ap.MappingProcessor",date = "2020-08-09T12:58:41+0800",comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)class PersonConverterImpl implements PersonConverter {@Overridepublic PersonDO dto2do(PersonDTO dto2do) {if ( dto2do == null ) {return null;}PersonDO personDO = new PersonDO();personDO.setName( dto2do.getUserName() );if ( dto2do.getAge() != null ) {personDO.setAge( dto2do.getAge() );}if ( dto2do.getGender() != null ) {personDO.setGender( dto2do.getGender().name() );}personDO.setAddress( homeAddressToString(dto2do.getAddress()) );return personDO;}
}

在运行期,对于bean进行映射的时候,就会直接调用PersonConverterImpl的dto2do方法,这样就没有什么特殊的事情要做了,只是在内存中进行set和get就可以了。因为在编译期做了很多事情,所以MapStruct在运行期的性能会很好,并且还有一个好处,那就是可以把问题的暴露提前到编译期。使得如果代码中字段映射有问题,那么应用就会无法编译,强制开发者要解决这个问题才行。

这篇关于Java MapStruct 字段映射工具类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956598

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c