学习笔记 - MapStruct 映射工具

news2025/1/16 13:59:18

学习笔记 - MapStruct 映射工具

  • 简介
  • Maven 依赖
  • 实体类 Entity
  • 数据传输对象 DTO
  • 映射接口
  • 测试类
  • IDEA 插件
  • 与 Lombok 一起使用
  • 参考资料

简介

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

  • 多层应用程序通常需要在不同对象模型(例如实体和dto)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct的目标是通过尽可能地自动化来简化这项工作。
    与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。

  • MapStruct是一个插入到Java编译器中的注解处理器,可以在命令行构建(Maven, Gradle等)中使用,也可以在您首选的IDE中使用。
    MapStruct使用合理的默认值,但当涉及到配置或实现特殊行为时,它也不会妨碍你。

Maven 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jerry</groupId>
    <artifactId>mapstruct-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
        <org.projectlombok.version>1.18.20</org.projectlombok.version>
        <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>4.13.1</version>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${org.mapstruct.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                                <version>${org.projectlombok.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok-mapstruct-binding</artifactId>
                                <version>${lombok-mapstruct-binding.version}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

实体类 Entity

package com.jerry;
import lombok.Data;
@Data
public class Hero{
    private String name;
    private Integer age;
    private Integer gender;
}

数据传输对象 DTO

package com.jerry;
import lombok.Data;
@Data
public class HeroDTO {
    private String name;
    private Integer sex;
}

映射接口

package com.jerry;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface HeroMapper {
    HeroMapper INSTANCE = Mappers.getMapper( HeroMapper.class );

    @Mapping(source = "gender", target = "sex")
    HeroDTO hero2HeroDTO(Hero hero);
}

测试类

package com.jerry;
import org.junit.Test;
public class HeroMapperTest {
    @Test
    public void hero2HeroDTO() {
        Hero hero = new Hero();
        hero.setName("笑虾");
        hero.setAge(18);
        hero.setGender(1);

        HeroDTO heroDto = HeroMapper.INSTANCE.hero2HeroDTO( hero );
        System.out.println(heroDto);
    }
}

IDEA 插件

MapStruct Support
在这里插入图片描述
安装插件后,将标放这里,按智能补全热键 Alt + / 可以列出所有字段供选择。
在这里插入图片描述
我这里用的是 Alt + / 我自定义过。因为默认的 Ctrl + 空格 跟我们切输入法冲突了。
在这里插入图片描述

与 Lombok 一起使用

版本匹配问题,如果版本对不上会报
Error:(11, 5) java: No property named "属性名" exists in source parameter(s). Type "类名" has no properties.

官方说MapStruct 可以和Lombok配合使用,比如 MapStruct 1.2.0.Beta1Lombok 1.16.14

如果您使用的是 Lombok 1.18.16更新版本,还需要添加 lombok-mapstruct-binding ,才能让LombokMapStruct协同工作。

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok-mapstruct-binding</artifactId>
   <version>0.2.0</version>
</dependency>

官方还有Demo:mapstruct-lombok

另外如果项目中已经使用旧版本的MapStructLombok,解决方案是将Lombok要修改的javabeanMapStruct要处理的映射器接口放在项目的两个独立模块中。然后Lombok将在第一个模块的编译中运行,从而在MapStruct在第二个模块的编译期间运行时完成bean类。

参考资料

官网:https://mapstruct.org

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第8章 关系数据库设计

第8章 关系数据库设计 考试范围&#xff1a; 8.1-8.5&#xff0c;8.8&#xff0c;8.9 考试题型: 模式分解 考试内容&#xff1a; INF概念 非规范化设计的问题&#xff1a;数据冗余&#xff0c;插入/删除/更新异常 函数依赖的概念 平凡函数依赖 函数依赖集 最小(正则)覆…

数据结构和算法学习笔记之 03.单向双向链表和环形链表构建

5.单向链表 把一个节点Node当做是一个对象&#xff0c;改对象里面包含了数据和指向下一个节点的引用指针 5.1 链表的添加和遍历 5.1.1 思路分析 添加 创建一个head头节点表示链表的头节点&#xff0c;里面的存放数据的data null每添加一个元素就直接添加到链表的最后(尾插法…

Practise test day9

另类加法_牛客网 解题思路&#xff1a;位运算符 1 0001 2 0010 按位与&&#xff1a;如果两个二进制位都为1&#xff0c;则返回1&#xff0c;否则返回0 按位异或&#xff1a;两个二进制位相同返回0&#xff0c;不同返回1。 1.二进制位异或的结果&#xff0c;是两个数对应相加…

https-OPenSSL证书生成及自签名证书

目录 SSL/TLS 1、搭建OPenssl服务器 1.1、下载 1.2、安装下载好的exe程序 2、服务器端证书-生成key、CSR、CRT 2.1、进入如下目录&#xff0c;执行cmd 2.2、生成一个私钥key 2.3、由生成的私钥key生成一个待签名的CSR证书文件(公钥) 2.4、查看证书内容 3、自建CA证书 3.1…

跨境电商卖家如何创建客户参与的 Facebook 广告?

关键词&#xff1a;跨境电商卖家、客户参与、Facebook广告 想要从您的 Facebook 广告中获得更多潜在客户或转化&#xff1f;正在寻找为您自己的广告建模的成功秘诀&#xff1f; 在本文中&#xff0c;您将了解创建消费者响应的 Facebook 广告的八个技巧。 将您现有的 Facebook 受…

零基础能否转行做程序员,那些半路出家的程序员大神给你做了榜样

这些年&#xff0c;随着中国互联网产业的高速发展&#xff0c;对程序员这个职业的需求越来越大。而相对较高的薪水、简单的人际关系、入行不需要靠拼爹这些优点&#xff0c;也让越来越多的年轻人选择了这个职业。甚至很多本来已经从事了其他行业的年轻人&#xff0c;也都想转行…

Promise(三) promise自定义封装25-35

1.初始结构搭建 2.resolve和reject结构搭建 3.throw抛出异常改变状态 4.promise对象状态只能修改一次 5.then方法执行回调 6.指定多个回调的实现 7.同步修改状态then方法结果返回 8.异步修改状态then方法结果返回 9.then方法完善与优化 10.catch方法——异常穿透与值管…

网络技术基础复习——计算机网络基本概念七层模型

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 前言 本章将会复习网络技术的一些知识&#xff0c;了解网络基础概念&#x…

如何学习python?python该怎么学?如何高效率学习python?分享python的学习资料和网站

如何学习python&#xff1f; 1、学好python的第一步&#xff0c;就是马上到网站上下载一个python版本。我建议初学者&#xff0c;不要下载具有IDE功能的集成开发环境&#xff0c;比如Eclipse插件等。 2、下载完毕后&#xff0c;就可以开始学习了。学习过程中&#xff0c;我建议…

商业报表工具-FineReport JS 实现动态隐藏参数以及控制参数面板高度

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 预期效果 开发报表的时&#xff0c;经常会遇到使用的参数控件较多的情况&#xff0c;这时候可以对一些不常用、不需要展现出来的的控件进行隐藏&#xff0c;当需要展示的时候再使其展示出来&#xff0c;如下图所示&…

数字化信道

数字化信道 数字化信道主要包括多相滤波和DFT两个模块。 多相滤波 多相滤波&#xff0c;就是将滤波器系数按照相数进行重排。在D倍抽取后&#xff0c;整个频带的频谱将混叠在0频附近[−Fs2D,Fs2D)[-\frac{F_s}{2D} ,\frac{F_s}{2D})[−2DFs​​,2DFs​​)。因此&#xff0c;…

超标量处理器设计——第四章_分支预测

超标量处理器设计——第四章_分支预测 参考《超标量处理器》姚永斌著 4.1 简述 分支预测主要与预测两个内容, 一个是分支方向, 还有一个是跳转的目标地址首先需要识别出取出的指令是否是分支指令, 如果是需要送入方向和地址预测模块: 分支预测最好的时机就是当前周期取到指令地…

【C++】拷贝构造函数

目录 默认拷贝构造函数 拷贝构造函数的原型&#xff1a; 为什么不用值传递&#xff1f; 为什么不用指针传递&#xff1f; 调用拷贝构造函数的3种情况 (旧对象去构造新对象) 我们熟悉的类型有以下操作&#xff1a; 1.声明&#xff1a;int a; 2.声明并初始化&#xff1a;in…

圣诞节怎么能缺少圣诞树呢?Python+HTML打造专属于你的圣诞树

前言&#xff1a; 美酒一杯让人醉&#xff0c;温馨陪伴浪漫随;雪花片片惹人爱&#xff0c;烦恼忧伤全不见;字里行间藏真情&#xff0c;文短情深送心愿:圣诞佳节快来到&#xff0c;祝大家永远开心幸福! Hello大家好&#xff0c;我是Dream。 圣诞节马上到了&#xff0c;一些朋友问…

非零基础自学Golang 第14章 反射 14.2 基本用法 14.2.1 获取类型信息

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.2 基本用法14.2.1 获取类型信息第14章 反射 14.2 基本用法 在使用反射时&#xff0c;我们会经常使用到反射的种类&#xff08;Kind&#xff09;&#xff0c;reflect.Kind在Go语言reflect包中的定义如下&#xff…

认知水平越低的人,越喜欢回复“收到”

前几天后台有位粉丝留言&#xff1a; “有一次回复’收到’&#xff0c;竟被领导痛批一顿&#xff01; 领导什么活都让我干&#xff0c;找资料、填表格、开会&#xff0c;虽然明知忙不过来&#xff0c;内心也不乐意做个打杂工&#xff0c;但嘴巴却只能缓缓吐出‘收到’两个字……

设计模式之中介者模式

Mediator design pattern 中介者模式的概念、中介者模式的结构、中介者模式的优缺点、中介者模式的使用场景、中介者模式的实现示例、中介者模式的源码分析 1、中介者模式的概念 中介者模式&#xff0c;又称调停模式&#xff0c;即定义一个中介者来封装原有多个对象之间的依赖…

SpringBoot中Redis使用之jedis

目录 pom.xml中导入坐标 application.yml添加配置 lettcus与jedis区别 本人springboot版本2.7.6&#xff0c;redis版本5.0.14.1亲测可用 pom.xml中导入坐标 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId&…

大学生自学Python去面试,月薪为何如此少?问题究竟出在哪?

市场上需要的Python人员非常多&#xff0c;而且按照现在的势头&#xff0c;以后会需要更多的Python开发人员&#xff0c;理由是以后每个人公司都会有自己的网站&#xff0c;有自己的开发部&#xff0c;对于用户体验看的非常重要。所以Python程序员就会很吃香。随时时间的推移&a…

62354-43-2,标记肽vLK-对硝基苯胺

很多蛋白在细胞中非常容易被降解&#xff0c;或被标记&#xff0c;进而被选择性地破坏。但含有部分D型氨基酸的多肽则显示了很强的抵抗蛋白酶降解能力。 纤溶酶和微纤溶酶的底物。微纤溶蛋白水解D-VLK-pNA的Km为0.361 /- 0.017 mM, kcat为40.3 /- 3.3 s&#xff0c;而原生纤溶蛋…