MapStruct的用法

news2024/11/8 17:59:09

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、依赖导入
  • 二、简单使用
    • 2.1、定义转换的接口
    • 2.2、创建实体类
    • 2.3、测试
    • 2.4、底层实现
  • 三、常用的注解
    • 3.1、@Mapping(target = "xxx1",source = "xxx2")
    • 3.2、@Mapping(target = "xxx", expression = "java(xxx1()")
    • 3.4、@Mapping(target = "xxx",constant = "xxx")
    • 3.5、@Mapping(target = "xx",defaultValue="x")
    • 3.6、@Mapping(target = "id", ignore = true)


前言

最近工作中发现公司代码中频繁用到MapStruct,了解之后发现特别好用,特此记录一下


一、依赖导入

使用Mapstruct需要依赖的包如下,mapstruct、mapstruct-processor、lombok,可以去仓库中查看最新版本。

<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

二、简单使用

2.1、定义转换的接口

@Mapper
public interface copy {

    copy INSTANCT= Mappers.getMapper(copy.class);
    UserPo po2entity(UserEntity userEntity);
}

2.2、创建实体类

import lombok.Data;
import java.util.Date;


@Data
public class UserPo {
    private String name;
    private Integer age;
    private Date createTime;
}
import lombok.Data;
import java.util.Date;
@Data
public class UserEntity {
    private String name;
    private Integer age;
    private Date createTime;
}

2.3、测试

    public static void main(String[] args) {
            UserEntity userEntity=new UserEntity();
            userEntity.setAge(18);
            userEntity.setName("汪汪");
            userEntity.setCreateTime(new Date());

            UserPo userPo=copy.INSTANCT.po2entity(userEntity);
            System.out.println(userEntity);
            System.out.println("-----------------------------------------");
            System.out.println(userPo);
    }

可以看到已经完美复制成功了
在这里插入图片描述

2.4、底层实现

那么这是怎么实现的呢?
从生成的代码可以看出,转化过程非常简单,只使用了UserPo的get方法和UserEntity的set方法,没有复杂的逻辑处理,清晰明了,所以性能很高。
在这里插入图片描述

三、常用的注解

3.1、@Mapping(target = “xxx1”,source = “xxx2”)

这个注解可以将 userEntity中name的值映射到UserPo中的bigname字段上
例如
首先修改UserPo

@Data
public class UserPo {
    private String bigname;
    private Integer age;
    private Date createTime;
}

然后修改对应方法

    @Mapping(target = "bigname",source = "name")
    UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到结果是预期的结果

3.2、@Mapping(target = “xxx”, expression = “java(xxx1()”)

这个注解可以把UserPo中createTime的值转换为java中的某个方法返回的值

@Mapping(target = "createTime",expression = "java(getdata())")
    UserPo po2entity(UserEntity userEntity);

    default Date getdata()
    {
        return new Date();
    }

在主函数中去掉userEntity.setCreateTime(new Date()

    public static void main(String[] args) {
            UserEntity userEntity=new UserEntity();
            userEntity.setAge(18);
            userEntity.setName("汪汪");
//          userEntity.setCreateTime(new Date());
            UserPo userPo=copy.INSTANCT.po2entity(userEntity);
            System.out.println(userEntity);
            System.out.println("-----------------------------------------");
            System.out.println(userPo);
    }

结果如下
请添加图片描述
可以看见符合预期结果
假如说一个字段的值需要从数据库里查 那么方法换成对应查询的方法就可以了

3.4、@Mapping(target = “xxx”,constant = “xxx”)

这个注解可以把某个值赋初始值

@Mapping(target = "age",constant = "1000")
UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到符合预期结果

3.5、@Mapping(target = “xx”,defaultValue=“x”)

该注解判断xx字段有无接收到值,没有的话赋默认值x 有的话用接收到的值

    @Mapping(target = "age",defaultValue="1")
    UserPo po2entity(UserEntity userEntity);

请添加图片描述
可以看到符合预期结果

3.6、@Mapping(target = “id”, ignore = true)

这个注解可以要指定映射的字段被忽略

    @Mapping(target = "age",ignore = true)
    UserPo po2entity(UserEntity userEntity);

在这里插入图片描述
结果是符合预期的

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

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

相关文章

你还在用System.currentTimeMillis()打印代码执行时间?

文章目录 前言一、开发环境二、使用步骤1. 创建Springboot项目2. 引入hutool3. 使用TimeInterval 总结 前言 Hutool是一个小而全的Java工具类库&#xff0c;里面集成了很多实用的工具类&#xff0c;比如文件、流、加密解密、转码、正则、线程、XML等&#xff0c;通过这些工具类…

探索 Java 8 中的 Stream 流:构建流的多种方式

人嘛&#xff0c;要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性&#xff0c;它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据&#xff0c;同时也能够实现并行处理&#xff0c;以提高性能。 以下是St…

在 GORM 中定义模型

为实现与数据库的无缝交互而打造有效模型的全面指南 在使用 GORM 进行数据库管理时&#xff0c;定义模型是基础。模型是您的应用程序的面向对象结构与数据库的关系世界之间的桥梁。本文深入探讨了在 GORM 中打造有效模型的艺术&#xff0c;探讨如何创建结构化的 Go 结构体&…

第十二章,集合类例题

例题1 package 例题;import java.util.*;public class 例题 {public static void main(String[] args) {// TODO Auto-generated method stub//实例化集合类对象Collection<String> list new ArrayList<>();//调用方法&#xff0c;向集合添加数据list.add("…

Java——java.time包使用方法详解

Java——time包使用方法详解 java.time 包是 Java 8 引入的新日期和时间 API&#xff08;JSR 310&#xff09;&#xff0c;用于替代旧的 java.util.Date 和 java.util.Calendar 类。它提供了一组全新的类来处理日期、时间、时间间隔、时区等&#xff0c;具有更好的设计和易用性…

什么是消息队列

什么是消息队列 消息队列是一种通信机制&#xff0c;用于在不同的应用程序或组件之间传递消息。它允许应用程序之间异步地发送和接收消息&#xff0c;而无需直接依赖彼此的可用性或性能。消息队列通常用于解耦不同组件&#xff0c;提高系统的可伸缩性和可维护性&#xff0c;以…

【Python入门一】Python及PyCharm安装教程

Python及PyCharm安装教程 1 Python简介1.1 Python下载及安装 2 PyCharm简介2.1 PyCharm下载及安装 参考 1 Python简介 Python是一种开源的高级编程语言&#xff0c;由Guido van Rossum于1991年创建。Python易于学习、阅读和编写&#xff0c;具有丰富的标准库和第三方模块&…

智慧校园管理云平台电子班牌系统源码,数据管理、信息发布、家校互通、物联控制、教务管理、日常办公、人脸识别

智慧校园平台源码 智慧校园云平台电子班牌系统源码 一款全功能智慧校园管理云平台电子班牌系统源码&#xff0c;融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用&#xff0c;是校园管理的现代手段。 电子班牌系统的主要功能包括&#xff1a;数据信…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V&#xff0c;电流高达500mA&#xff0c;而三个同步降压转换器的输入电压范围为3.0V至4.2V&#xff0c;输出电压范围为0.8V至3.9875V&#xff0c;峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

c++实现建造者模式

代码 director.h #pragma once #include<vector> #include<string> #include<iostream>class Product { private:std::vector<std::string> _parts;public:void Add(const std::string& part) {_parts.push_back(part);}void show(){std::cout &…

L1和L2正则化通俗理解

机器学习中&#xff0c;如果参数过多&#xff0c;模型过于复杂&#xff0c;容易造成过拟合&#xff08;overfit&#xff09;。即模型在训练样本数据上表现的很好&#xff0c;但在实际测试样本上表现的较差&#xff0c;不具备良好的泛化能力。为了避免过拟合&#xff0c;最常用的…

在Linux上通过NTLM认证连接到AD服务器(未完结)

这篇文章目前还没有实现具体的功能&#xff0c;只实现了明文登录&#xff0c;因为我缺少一些数据&#xff0c;比如通过密码生成hash&#xff0c;以及通过challenge生成response&#xff0c;我不知道怎么实现&#xff0c;因此这篇文章也是一个交流的文章&#xff0c;希望大佬看见…

Linux的test测试功能

测试文件名的类型&#xff0c;文件是否存在&#xff0c; 文件的权限检测 文件之间的比较 两个整数之间的比较 判断字符串数据 多重条件判定 一个一个来&#xff0c;这个有点多&#xff0c;不过比较有意思&#xff0c;来代码 案例1&#xff0c;判断文件是否存在&#xff…

VS Code提取扩展时出错。XHR failed

需求&#xff1a;想要在扩展中心下载插件&#xff0c;发现报错 原因&#xff1a;vs code之前设置了代理&#xff0c;需要删除即可

【LLM】大模型中的温度系数temperature是啥玩意||底层逻辑

【LLM】大模型中的温度系数是啥玩意_山顶夕景的博客-CSDN博客 大佬两句话就讲明白了&#xff0c;厉害~ 总结一下就是crossentropy里面引入t如下页ppt公式所示&#xff0c;t越大&#xff0c;每个词都有更大的概率被使用&#xff0c;也就体现出了多样性。

基于OR-Tools的装箱问题模型求解(PythonAPI)

装箱问题 一、背包问题&#xff08;Knapsack problem&#xff09;1.1 0-1背包模型基于OR-Tools的0-1背包问题求解&#xff08;PythonAPI&#xff09;导入pywraplp库数据准备声明MIP求解器初始化决策变量初始化约束条件目标函数调用求解器打印结果 1.2 多重背包问题&#xff08;…

74X138元件怎么找——错误解决方法

1.在做74X138的时候根据课本&#xff0c;无法在现有的库中找到74X138&#xff0c;搜索了老师发的库中&#xff0c;都是集成库打不开&#xff0c;那我该怎么办? 根据这个课本P343&#xff0c;&#xff08;即机械工业出版社&#xff0c;刘超&#xff0c;包建荣&#xff0c;俞优姝…

深入理解TCP协议

深入理解TCP 1.TCP基础概念了解 1.1简介 TCP&#xff08;Transmission Control Protocol&#xff09;是一种计算机网络协议&#xff0c;用于在网络上可靠地传输数据。它确保数据的完整性、顺序性和可靠性&#xff0c;通过建立连接、数据分段、错误检测和恢复机制&#xff0c…

什么是DNS

什么是DNS 概述 域名系统&#xff08;英语&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网**。DNS使用[TCP和UDP端口53。当前&#…

【算法练习Day36】最后一块石头的重量 II目标和一和零

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 最后一块石头的重量 II目标…