MapStruct初窥门径

一、介绍

MapStruct相比于BeanUtils性能更高,能够实现DO,DTO,VO之间的转换,达到解耦合的目的

二、使用前提

  1. 添加依赖
		<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.5.Final</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.5.Final</version><scope>provided</scope></dependency>
  1. 新建一个接口StudentConvert,实现不同POJO之间的转换
  • 接口中需要使用MapStruct的一个注解@Mapper,利用MapStruct的工厂创建一个studentConvert类,可以通过该类调用类中的方法
  1. 新建DO,DTO,VO类
  • DO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentDO {private Integer id;private String name;private String password;private String phoneNumber;private Integer gender;private Double price;private Date birthDay;private SubjectDO subjectDO;}
@Data
public class SubjectDO {private Integer id;private String name;
}
  • DTO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentDTO {private Integer id;private String studentName;private String phoneNumber;private String gender;private String price;private String birthDay;private SubjectDTO subjectDTO;}
@Data
public class SubjectDTO {private Integer subjectId;private String subjectName;
}
  • VO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentVO {private Integer id;private String studentName;private Boolean hasPhoneNumber;private String gender;
}

三、使用示例

1.DO 转 DTO

  • 转换逻辑
@Mapper
public interface StudentConvert {StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class);/*** DO convert to DTO* @param studentDO StudentDO* @return com.haomiao.algorithm.pojo.StudentDTO*/StudentDTO doToDto(StudentDO studentDO);
}
  • 进行测试
	@Testvoid doConvertDto(){StudentDO studentDO = buildStudentDO();StudentDTO studentDTO = StudentConvert.INSTANCE.doToDto(studentDO);System.out.println(studentDTO);}StudentDO buildStudentDO(){StudentDO studentDO = new StudentDO();studentDO.setId(1);studentDO.setName("zhangsan");studentDO.setPassword("Qw123");studentDO.setPhoneNumber("15271861495");studentDO.setGender(1);studentDO.setPrice(22.1234d);studentDO.setBirthDay(new Date());studentDO.setSubjectDO(buildSubjectDO());return studentDO;}SubjectDO buildSubjectDO(){SubjectDO subjectDO = new SubjectDO();subjectDO.setId(12);subjectDO.setName("数学");return subjectDO;}
  • 输出结果为:
StudentDTO(id=1, name=null, phoneNumber=15271861495, gender=1, birthDay=23-10-4 下午5:25, price=22.1234, subjectDTO=null)

因此得出结论:

  1. 同类型同名的属性会自动映射
  2. 就算不是同类型,也会自动进行类型转换
  • 8种基本类型及其对应的包装类型之间会自动转换
  • 8种基本类型(及其对应的包转类型)和String会自动转换
  • 日期类型和String之间会自动转换

四、@Mappings注解

@Mappings由多个@Mapping注解组成

作用:自定义映射

1.小数格式化

注意使用numberFormat时,小数转换为小数是不行的

  • 将Double类型保留两位小数,映射为String类型
	@Mappings(@Mapping(source = "price",target = "price",numberFormat = "#.00"))StudentDTO doToDto(StudentDO studentDO);
  • 输出结果为:
StudentDTO(id=1, name=null, phoneNumber=15271861495, gender=1, birthDay=23-10-4 下午5:51, price=22.12, subjectDTO=null)
2.时间格式化
  • 使用dateFormat
	@Mappings(value = {@Mapping(source = "price",target = "price",numberFormat = "#.00"),@Mapping(source = "birthDay",target = "birthDay",dateFormat = "yyyy-MM-dd HH:mm:ss")})StudentDTO doToDto(StudentDO studentDO);
  • 输出结果为:
StudentDTO(id=1, name=null, phoneNumber=15271861495, gender=1, birthDay=2023-10-04 17:57:22, price=22.12, subjectDTO=null)
3.忽略某个属性映射
  • 使用ignore
@Mappings(value = {@Mapping(source = "price",target = "price",numberFormat = "#.00"),@Mapping(source = "birthDay",target = "birthDay",dateFormat = "yyyy-MM-dd HH:mm:ss"),@Mapping(target = "phoneNumber",ignore = true)})StudentDTO doToDto(StudentDO studentDO);
  • 输出结果为:
StudentDTO(id=1, name=null, phoneNumber=null, gender=1, birthDay=2023-10-04 18:02:17, price=22.12, subjectDTO=null)
4.名称不同映射
@Mappings(value = {@Mapping(source = "price",target = "price",numberFormat = "#.00"),@Mapping(source = "birthDay",target = "birthDay",dateFormat = "yyyy-MM-dd HH:mm:ss"),@Mapping(target = "phoneNumber",ignore = true),@Mapping(source = "name",target = "studentName")})StudentDTO doToDto(StudentDO studentDO);
  • 输出结果为:
StudentDTO(id=1, studentName=zhangsan, phoneNumber=null, gender=1, birthDay=2023-10-04 18:16:04, price=22.12, subjectDTO=null)
5.复杂类型转换
  • 在转换方法中,对复杂类型再添加一个转换规则,如下:
@Mapper
public interface StudentConvert {StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class);/*** DO convert to DTO* @param studentDO StudentDO* @return com.haomiao.algorithm.pojo.StudentDTO*/@Mappings(value = {@Mapping(source = "price",target = "price",numberFormat = "#.00"),@Mapping(source = "birthDay",target = "birthDay",dateFormat = "yyyy-MM-dd HH:mm:ss"),@Mapping(target = "phoneNumber",ignore = true),@Mapping(source = "name",target = "studentName"),@Mapping(source = "subjectDO",target = "subjectDTO")})StudentDTO doToDto(StudentDO studentDO);/*** DO convert to DTO* @param subjectDO SubjectDO* @return com.haomiao.algorithm.pojo.SubjectDTO*/@Mapping(source = "id",target = "subjectId")@Mapping(source = "name",target = "subjectName")SubjectDTO subjectDo2SubjectDto(SubjectDO subjectDO);
}
  • 输出结果为:
StudentDTO(id=1, studentName=zhangsan, phoneNumber=null, gender=1, birthDay=2023-10-04 18:27:28, price=22.12, subjectDTO=SubjectDTO(subjectId=12, subjectName=数学))
  • 可以观察生成的代码
    在这里插入图片描述
6.MapStruct规则无法映射,自定义映射规则
  • 使用@AfterMapping和@MappingTarget注解

注意:这种使用场景需要自己实现方法逻辑,因此需要转换的类为抽象类,而非接口,之前的案例使用接口实现,这里可以参考别人的抽象类实现:

在这里插入图片描述

7.批量转换

在这里插入图片描述

8.BeanMapping使用(适用于只需要映射少量字段的情况)

在这里插入图片描述

9.InheritConfigration

在这里插入图片描述

10.反向继承
  • 注意:只会继承@Mapping注解,不会继承BeanMapping注解
    在这里插入图片描述
11.结合Spring

在这里插入图片描述

  • 注意:如果要使用Spring容器注入,需要删除下面代码
    StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148634.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习记忆——宫殿篇——记忆宫殿——数字编码——扑克牌记忆

扑克牌我们可以通过以下3点进行识记&#xff1a; 1、先把扑克牌进行编码转换 2、确定要进行记忆的记忆宫殿 3、把扑克牌与记忆宫殿一一对应 首先54张扑克牌除去大小王后剩下52张&#xff0c;因为世界赛不需要记忆大小王。52张扑克牌都有对应的编码&#xff0c;每2张扑克牌对应…

JVM篇---第三篇

系列文章目录 文章目录 系列文章目录一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、Java内存结构三、说说对象分配规则一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文…

如何将图片存到数据库(以mysql为例), 使用ORM Bee更加简单

如何将图片存到数据库 1. 创建数据库: 2. 生成Javabean public class ImageExam implements Serializable {private static final long serialVersionUID 1596686274309L;private Integer id;private String name; // private Blob image;private InputStream image; //将In…

【Java】抽象类案例

需求&#xff1a;加入我们在开发一个系统时 需要对员工&#xff08;Employee&#xff09;类进行设计&#xff0c;员工包含3个属性&#xff1a;姓名、工号&#xff08;number&#xff09;以及工资&#xff08;salary&#xff09;。 经理&#xff08;Manager&#xff09;也是员工…

【物联网】STM32的中断机制不清楚?看这篇文章就足够了

在嵌入式系统中&#xff0c;中断是一种重要的机制&#xff0c;用于处理来自外部设备的异步事件。STM32系列微控制器提供了强大的中断控制器&#xff0c;可以方便地处理各种外部中断和内部中断。本文将详细介绍STM32中断的结构和使用方法。 文章目录 1. 什么叫中断2. 中断优先级…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

给列起别名(关键字:as)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1 as 别名1, 列名2 as 别名2, 列名n as 别名n from 表名; 说明&#xff1a;可以省略as&#xff0c;列名和别名之间使用空格…

多目标跟踪框架boxmot介绍

引言 boxmot由mikel brostrom开发&#xff0c;用于目标检测&#xff0c;分割和姿态估计模型的SOTA&#xff08;state of art&#xff09;跟踪模块&#xff0c;现已加入python第三方库 PYPI&#xff0c;可用pip包管理器进行安装。 boxmot所支持的跟踪器采用外观特征识别方法&am…

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解&#xff0c;没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列&#xff0c;借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节&#xff08;不含代码&#xff09;可…

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

以下是中高级Java软件工程师常见编程面试题&#xff0c;共有20道。 如何判断一个数组是否为有序数组&#xff1f; 答案&#xff1a;可以通过一次遍历&#xff0c;比较相邻元素的大小。如果发现相邻元素的大小顺序不对&#xff0c;则数组不是有序数组。 public boolean isSort…

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

一、声明 只实现物理反弹的效果&#xff0c;不实现蹦床会有的视觉拉伸效果&#xff0c;请自行找相关代码 二、实现 经过我的实践&#xff0c;我发现要想实现一个平台反弹的效果&#xff0c;要么就选择给player添加一个物理材质&#xff08;平台加了没用&#xff09;&#xff0…

arduino嵌入式1,LED闪烁案例

CVE系列在等等吧&#xff0c;环境我有点懒得搭建了 文章目录 前言一、anduino是什么玩意儿&#xff1f;二、使用步骤1.找蓝图/画蓝图2.写入数据成果 总结 前言 最近在学习嵌入式开发&#xff0c;我的单片机到了&#xff0c;然后我就沉迷于嵌入式开发的环境中 提示&#xff1a;…

Linux嵌入式学习之Ubuntu入门(六)shell脚本详解

系列文章内容 Linux嵌入式学习之Ubuntu入门&#xff08;一&#xff09;基本命令、软件安装、文件结构、编辑器介绍 Linux嵌入式学习之Ubuntu入门&#xff08;二&#xff09;磁盘文件介绍及分区、格式化等 Linux嵌入式学习之Ubuntu入门&#xff08;三&#xff09;用户、用户组…

go-fastdfs分布式文件存储集群搭建和测试

一、官方文件 https://sjqzhang.github.io/go-fastdfs/#character2、集群原理 小集群原理&#xff1a; 大集群原理 二、服务端集群部署 1、在集群每个节点机器上下载安装包 (建议使用最新稳定版本&#xff09; wget --no-check-certificate https://github.com/sjqzhang/go…

【Linux基础】Linux发展史

&#x1f449;系列专栏&#xff1a;【Linux基础】 &#x1f648;个人主页&#xff1a;sunny-ll 一、前言 本篇主要介绍Linux的发展历史&#xff0c;这里并不需要我们掌握&#xff0c;但是作为一个合格的Linux学习者与操作者&#xff0c;这些东西是需要了解的&#xff0c;而且…

docker基本命令

一、镜像操作 1、搜索镜像 docker search 仓库名/镜像名 2、下载镜像 docker pull 仓库名/镜像名&#xff1a;标签 若不指明标签&#xff0c;则表示下载最新版本的【标签为latest】 3、查看镜像 docker images 4、创建镜像 docker tag 原仓库/镜像名&#xff1a;原标名 新…

机器人制作开源方案 | 家庭清扫拾物机器人

作者&#xff1a;罗诚、李旭洋、胡旭、符粒楷 单位&#xff1a;南昌交通学院 人工智能学院 指导老师&#xff1a;揭吁菡 在家庭中我们有时无法到一些低矮阴暗的地方进行探索&#xff0c;比如茶几下或者床底下&#xff0c;特别是在部分家庭中&#xff0c;如果没有及时对这些阴…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加&#xff0c;随着国家等保政策的严格执行&#xff0c;越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌&#xff0c;让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

【应用层协议】HTTPS的加密流程

文章目录 1. 认识HTTPS2. 密文3. HTTPS加密流程3.1 对称加密3.2 非对称加密3.3 证书 1. 认识HTTPS HTTPS&#xff08;超文本传输协议安全&#xff09;也是一个应用层协议&#xff0c;它是在HTTP协议的基础上引入了一个加密层。 也就是HTTP协议传输文本的方式是明文&#xff0c;…

【Docker Compose】Docker Compose 的安装,使用以及实现微服务集群的部署

文章目录 前言&#xff1a;Docker 部署存在的问题一、 初识 Docker Compose1.1 什么是 Docker Compose1.2 在 CentOS 上安装 Docker Compose 二、深入了解 Docker Compose 文件2.1 Docker Compose 文件概述2.2 Docker Compose 文件详解2.3 示例&#xff1a;编写 Docker Compose…