广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MapStruct到底是什么?
  • 769
分享到

MapStruct到底是什么?

2024-04-02 19:04:59 769人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、简介 现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。 MapStruct 就是这样的一个属性映射插件,用于为Ja

一、简介

现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。

MapStruct 就是这样的一个属性映射插件,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了繁琐的映射实现。

🍭 官网 - 🍤 官方示例

优点

与手工编写映射代码相比

  • MapStruct通过生成冗长且容易出错的代码来节省时间。

与动态映射框架相比

  • 简单泛型智能转换;
  • 效率高:无需手动 set/get 或 implements Serializable 以达到深拷贝;
  • 性能更高:使用简单的 Java 方法调用代替反射;
  • 编译时类型安全:只能映射相同名称或带映射标记的属性;
  • 编译时产生错误报告:如果映射不完整(存在未被映射的目标属性)或映射不正确(找不到合适的映射方法或类型转换)则会在编译时抛出异常。

二、Demo

2.1 导入依赖

使用该插件主要需要导入两个包:

::: details Maven | Gradle

Maven


<dependency>
        <groupId>org.mapstruct</groupId>
        <!-- jdk8以下就使用mapstruct -->
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.3.0.Final</version>
    </dependency>
				<!-- 注解处理器 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.3.0.Final</version>
    </dependency>

Gradle


plugins {
    ...
    id "com.diffplug.eclipse.apt" version "3.26.0" // Only for Eclipse
}

dependencies {
    ...
    compile 'org.mapstruct:mapstruct:1.4.2.Final'

    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
    testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final' // if you are using mapstruct in test code
}
...

2.2 示例代码

::: details domain、vo、mapper、controller

domain/Person.java


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private Long id;

    private String name;

    private Integer age;

    private Integer sex;

}

vo/PersonVO.java


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonVO {
    private Long personId;
    private String personName;
    private Integer age;
}

mapper/PersonMapper.java


@Mapper(componentModel = "spring")
public interface PersonMapper {
    
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    
    @Mappings({
            @Mapping(source = "id", target = "personId"),
            @Mapping(source = "name", target = "personName")
    })
    PersonVO toPersonVO(Person person);

    
    @Mappings({
            @Mapping(source = "personId", target = "id"),
            @Mapping(source = "personName", target = "name"),
      			@Mapping(target = "sex", ignore = true),
    })
    Person toPerson(PersonVO person);

}

Controller


@RestController
@RequestMapping("/api")
public class TestMapStructController {

    @Autowired
    PersonMapper personMapper;

    @GetMapping("convert")
    public List<Object> convertEntity() {
        ArrayList<Object> objectList = new ArrayList<>();
        Person person = Person.builder()
                .id(5L)
                .name("zhangsan")
                .age(12)
                .sex(1)
                .build();
        objectList.add(person);

        PersonVO personVO = personMapper.toPersonVO(person);
        Person person1 = personMapper.toPerson(personVO);
        objectList.add("person 转 personVO" + personVO);
        objectList.add("personVO 转 person" + person1);
        return objectList;
    }
}

打包后会看见 mapstruct 为我们生成了 mapper 的实现类

image-20210609160633395 

三、 注解介绍

@Mapper :MapStruct 注解处理器会扫描这个注解

先介绍一下 @Mapper 注解的 componentModel 属性,该属性用于自动生成的接口实现类的组件类型,这个属性支持四个值:

1.default : 这是默认的情况,mapstruct 不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。

2.cdi : 生成的映射器是一个应用程序范围的 CDI bean,可以通过 @Inject 检索

3.spring : 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入

4.jsr330 : 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取

@Mappings:配置多个@Mapping

@Mapping 属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性

1.source :参数类的属性

2.target :要转换的类的属性

3.ignore :配合 target 使用,表示改转换类的的属性不需要映射

4.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换


@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFORMat( s.getTime(), s.getFormat() ))"
)

5.expression :配合 target 使用,表示改转换类的的属性使用指定的表达式进行转换


@Mapping(
         target = "someProp",
         expression = "java(new TimeAndFormat( s.getTime(), s.getFormat() ))"
)

其他请参考源文件或官网,后续用到再补充

到此这篇关于MapStruct到底是什么?的文章就介绍到这了,更多相关MapStruct的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MapStruct到底是什么?

本文链接: https://www.lsjlt.com/news/128306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MapStruct到底是什么?
    一、简介 现在的分布式系统中模块划分越来越细,不同模块的实体、DTO、DO等需要进行转换,这么多工程处理起来不是那么简单。 MapStruct 就是这样的一个属性映射插件,用于为Ja...
    99+
    2022-11-12
  • javascript到底是什么
    这篇文章主要介绍“javascript到底是什么”,在日常操作中,相信很多人在javascript到底是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript...
    99+
    2022-10-19
  • 到底什么是SSL
    本篇内容介绍了“到底什么是SSL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  什么是SSL?  SSL是一种使用TCP / IP在两个通...
    99+
    2023-06-04
  • ViewState到底是什么
    ViewState是ASP.NET Web Forms中的一个重要概念,用于在Web服务器上存储和恢复页面的状态数据。在Web应用程...
    99+
    2023-09-01
    ViewState
  • C++ set到底是什么
    目录1、set是什么2、set有什么用1、set是什么 如果大家学过几门编程语言,会发现各大语言的特性虽然迥异,但是总有几个东西反复出现刷存在感。它们在各个语言当中的名字虽然不太一样...
    99+
    2022-11-12
  • Live-USB到底是什么
    本篇文章给大家分享的是有关Live-USB到底是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们平时所说的“U 盘”,正式名称是“USB闪存驱动器”(USB Flash ...
    99+
    2023-06-16
  • JS闭包到底是什么
    这篇文章主要讲解了“JS闭包到底是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS闭包到底是什么”吧!  在JavaScript这...
    99+
    2022-10-19
  • 详解JNI到底是什么
    目录一、前言二、准备java代码三、生成头文件四、gcc环境安装五、生成动态链接库六、总结一、前言 首先回顾一下jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一...
    99+
    2022-11-12
  • HTML5到底是什么东西
    HTML,全称为“Hypertext Markup Language”,即超文本标记语言,是Web页面的构建语言。而HTML5,就是HTML的第五代规范,是目前最新的HTML规范。HTML5被认为是Web技术发展的重要里程碑,它的出现为We...
    99+
    2023-05-14
  • 云服务器到底是什么
    云服务器是一种虚拟的计算服务平台,用户可以通过互联网访问它来存储、管理和访问数据、应用程序和其他资源。云服务器通常包括许多功能,例如弹性存储、备份和恢复、负载均衡和安全管理等。 云服务器是一种高性能、可靠的计算服务,它可以提供高速、可靠的...
    99+
    2023-10-26
    到底是什么 服务器
  • Python中的类到底是什么
    这篇文章主要介绍“Python中的类到底是什么”,在日常操作中,相信很多人在Python中的类到底是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的类到底是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-15
  • Python到底是个什么东西
     1、Python是一门脚本语言,像awk、tcl、perl、ruby一样,解释执行(可以编译缓存); 2、Python是一个绿色软件,解压即可使用,方便灵活; 3、安装一个Python库非常方便,大部分封装包都带有setup.py,只需要...
    99+
    2023-01-31
    是个什么东西 Python
  • Python的优势到底是什么
    本篇内容介绍了“Python的优势到底是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python的优点简单:Python是一种代表简单...
    99+
    2023-06-02
  • Python Numpy Load API到底是什么?
    Python是一种广泛使用的编程语言,它有着强大的科学计算能力和丰富的第三方库,其中Numpy库是Python中最为重要的科学计算库之一。Numpy库提供了高效的数组操作和数学函数,使得数据处理和科学计算变得更加简单。其中,Numpy L...
    99+
    2023-09-04
    numpy load api
  • 到底什么是DNS服务器
    本篇内容介绍了“到底什么是DNS服务器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概括的说DNS 是计算机域名 系统(Domain Nam...
    99+
    2023-06-07
  • java虚拟机到底是什么
    Java虚拟机(Java Virtual Machine,简称JVM)是一种能够运行Java字节码的虚拟计算机。它是Java编程语言...
    99+
    2023-08-25
    java
  • 【数据库】到底什么是关系?
    计算机学习者经常会用到诸如Sqlserver Mysql Orcal 等“关系型”数据库。   问题一:那么,到底什么是“关系”呢?   首先,我们来看以下三组数据                       注:A1,A2表示具...
    99+
    2016-03-30
    【数据库】到底什么是关系?
  • C++类和对象到底是什么
    目录1、C++ 中的类2、面向对象编程(Object Oriented Programming,OOP)1、C++ 中的类 C++ 中的类(Class)可以看做C语言中结构体(Str...
    99+
    2022-11-12
  • Python打包缓存到底是什么?
    Python打包缓存到底是什么? Python是一种广泛使用的高级编程语言,其简单易用的特性受到了许多开发者的青睐。在Python开发过程中,打包和缓存是两个十分重要的概念。本文将详细介绍Python打包缓存的定义、作用、实现方法以及相关的...
    99+
    2023-08-27
    打包 缓存 编程算法
  • gitlab的用户名到底是什么
    Gitlab是一种基于Git的源代码管理工具,除了常规的代码管理功能,它还提供了很多其他的功能,通过这些功能的组合,可以帮助开发团队更好地管理代码项目。其中,Gitlab的用户名是其中一个基本的信息,但是在实际应用中,很多用户可能会对Git...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作