首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MapStruct:如何映射到现有目标?

基础概念

MapStruct 是一个用于生成类型安全且易于维护的映射代码的代码生成器。它主要用于对象之间的属性映射,减少了手动编写映射代码的工作量,并提高了代码的可读性和可维护性。

相关优势

  1. 类型安全:MapStruct 在编译时检查映射的正确性,减少了运行时错误。
  2. 性能:生成的代码是直接的方法调用,没有反射的开销,因此性能较高。
  3. 易于维护:当源对象或目标对象的属性发生变化时,只需重新生成映射代码,而不需要手动修改映射逻辑。
  4. 灵活性:支持自定义映射逻辑,可以处理复杂的映射需求。

类型

MapStruct 支持多种类型的映射,包括:

  • 基本类型之间的映射
  • 对象之间的映射
  • 集合之间的映射
  • 枚举之间的映射

应用场景

MapStruct 广泛应用于数据传输对象(DTO)和领域模型之间的映射,特别是在使用 Spring 和 JPA 等框架进行开发时。

映射到现有目标

如果你需要将源对象的属性映射到一个已经存在的目标对象上,可以使用 @MappingTarget 注解。以下是一个示例:

示例代码

假设我们有两个类 SourceTarget

代码语言:txt
复制
public class Source {
    private String name;
    private int age;
    // getters and setters
}

public class Target {
    private String name;
    private int age;
    // getters and setters
}

我们可以定义一个映射接口 Mapper

代码语言:txt
复制
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;

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

    void updateTarget(Source source, @MappingTarget Target target);
}

在这个接口中,updateTarget 方法使用了 @MappingTarget 注解,表示目标对象 target 已经存在,并且我们只需要更新它的属性。

使用示例

代码语言:txt
复制
public class Main {
    public static void main(String[] args) {
        Source source = new Source();
        source.setName("John");
        source.setAge(30);

        Target target = new Target();
        target.setName("Old Name");
        target.setAge(0);

        Mapper.INSTANCE.updateTarget(source, target);

        System.out.println(target.getName()); // 输出: John
        System.out.println(target.getAge());  // 输出: 30
    }
}

参考链接

通过这种方式,你可以高效地将源对象的属性映射到已经存在的目标对象上,避免了手动编写复杂的映射逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你居然不知道MapStruct

4.更新现有的Bean 某些情况下,你需要不创建目标类型的新实例,而是更新该类型的现有实例的映射。...可以通过为目标对象添加参数并使用@MappingTarget标记此参数来实现此类映射。 例如Student我们将学生类的名字和年龄映射到VO中,但是不创建新的实例。...另一个例子是对其他对象的引用,这些对象应该映射到目标模型中的相应类型。例如:Teachr类可能有一个Wife类型的属性wife,在映射VO对象时需要将其转换为StudentVO对象。...默认情况下,源枚举中的每个常量都映射到目标枚举类型中具有相同名称的常量。如果需要,可以使用@ValueMapping注解将源枚举中的常量映射到具有其他名称的常量。...源枚举中的几个常量可以映射到目标类型中的相同常量。

2.4K31
  • MapStruct1.5使用教程(高级版)

    source = “model”, target = “modelName”:将源对象的model属性映射到目标对象的modelName属性。...) PersonDto personToPersonDto(Person person); nullValuePropertyMappingStrategy: 这个参数允许你指定当源属性为null时应如何处理目标属性...使用构造函数映射 从MapStruct 1.5开始,你可以使用构造函数来创建目标对象。你只需要在你的目标类中定义一个合适的构造函数,MapStruct就会自动使用它。...使用@MapMapping 注解来处理 Map 类型的映射 @MapMapping 注解用于方法级别,指示 MapStruct 如何映射 Map 类型的属性。...通过这样配置 @MapMapping 注解,MapStruct 将自动生成适当的映射代码,按照指定的映射规则将源 Map 中的键值对映射到目标 Map。

    1.4K10

    5分钟聊一聊Java中的原型模式

    原型模式(Prototype Pattern)作为一种创建型设计模式,通过克隆现有对象来创建新对象,从而显著提高了对象创建的效率。...本文将深入探讨原型模式的深复制和浅复制,并介绍如何结合 MapStruct 工具类进行对象转换。原型模式概述原型模式的核心思想是通过复制现有对象来创建新对象,而不是通过构造函数逐步初始化对象。...MapStruct 提供了一种高效的方式来将一个对象的属性映射到另一个对象,特别适合用于数据传输对象(DTO)和业务对象(BO)之间的转换。...配置 MapStruct首先,我们需要在项目中添加 MapStruct 的依赖。...sheepToSheepDTO(Sheep sheep); Sheep sheepDTOToSheep(SheepDTO sheepDTO);}定义数据传输对象(DTO)创建 SheepDTO 类作为转换的目标对象

    13131

    对象拷贝 - 优雅的解决方案 Mapstruct

    在编译的过程中,MapStruct会生成此接口的实现。该实现使用纯java方法调用的源和目标对象之间的映射,MapStruct节省了时间,通过生成代码完成繁琐和容易出错的代码逻辑。。...MapStruct 拥有的优点: 使用普通方法调用而不是反射来快速执行,他会在编译器生成相应的 Impl 方法调用时直接通过简单的 getter/setter调用而不是反射或类似的方式将值从源复制到目标...编译时类型安全性 : 只能映射彼此的对象和属性,不能将商品实体意外映射到用户 DTO等 在构建时清除错误报告,如 映射不完整 (并非所有目标属性都被映射) 或 映射不正确(无法找到适当的映射方法或类型转换...) MapStruct 提供的重要注解 : @Mapper : 标记这个接口作为一个映射接口,并且是编译时 MapStruct 处理器的入口 @Mapping : 解决源对象和目标对象中,属性名字不同的情况...CarDto> carsToCarDtos(Stream cars);     CarDto carToCarDto(Car car); } 映射枚举 : 默认情况下,源枚举中的每个常量映射到目标枚举类型中具有相同名称的常量

    6.8K20

    java开发中DTO、VO、PO之间的转换你应该这么操作

    以下是对几种对象映射框架的对比,大多数情况下 MapStruct 性能最高。类似于lombok ,Mapstruct都是在编译期进行实现,所以一般不存在运行时性能问题。 ?...so,今天就搞一搞MapStruct, 无论是idea 还是eclipse 都建议安装 mapstruct 插件。 安装 引入maven 依赖坐标 ?...mapStruct 最终调用的是setter和getter 方法,而非反射。这也是其性能比较好的原因之一。numberOfSeats 映射到seatCount 就比较好理解了。...当目标值是null 我们可以设置其默认值,注意这些都是基本类型以及对应都boxing类型,如下 @Mapping(target = "stringProperty", source = "stringProp...这是处理数字格式化的操作,遵循java.text.DecimalFormat的规范 @Mapping(source = "price", numberFormat = "$#.00") 下面展示了将一个日期集合映射到日期字符串集合的格式化操作上

    8.9K20

    MapStruct入门教程详解:轻松掌握Java Bean映射

    文章目录 MapStruct入门教程详解:轻松掌握Java Bean映射 摘要 引言 正文 MapStruct基础 安装和配置 使用MapStruct进行对象映射 基本映射 高级配置 实战演练:...通过阅读本文,您将学习到如何使用MapStruct进行高效的对象映射,不仅能提高开发效率,还能确保代码的清晰和可维护性。...正文 MapStruct基础 MapStruct是一种声明性的Java注解处理器,用于生成源对象和目标对象之间的类型安全的映射代码。...numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car); } 在上面的代码中,Car的numberOfSeats字段将映射到...Q3: 如何处理集合类型的映射? A3: MapStruct自动处理集合到集合的映射,无需特别配置。 小结 通过本文的学习,我们详细了解了MapStruct的安装、配置、基本使用方法以及高级特性。

    1.4K10

    MapStruct:Java代码转换的终极武器

    应用场景MapStruct适用于任何需要对象映射的场景,如数据传输对象(DTO)和数据库实体之间的映射。5. 代码示例下面是一个使用MapStruct的示例,展示了如何将实体类映射到数据传输对象。...MapStruct会根据这些规则生成实际的映射代码。源码解读为了更好地理解MapStruct的工作原理,我们来简单解读一下MapStruct的源码。...代码生成过程注解解析:MapStruct解析@Mapper和@Mapping注解。映射规则分析:根据注解定义的规则,分析源对象和目标对象的属性。代码生成:根据分析结果,生成映射代码。...@Mapping注解指定了源对象和目标对象属性之间的映射关系。应用场景MapStruct适用于多种场景,包括但不限于:DTO转换:在表示层和业务层之间转换数据传输对象。...类型安全:MapStruct生成的代码是类型安全的,因为它在编译时就能检查映射规则的正确性,确保源对象和目标对象之间的属性类型匹配。

    32310

    干掉 BeanUtils!试试这款 Bean 自动映射工具,真心强大!

    关于BeanUtils 平时我经常使用Hutool中的BeanUtil类来实现对象转换,用多了之后就发现有些缺点: 对象属性映射使用反射来实现,性能比较低; 对于不同名称或不同类型的属性无法转换,还得单独写...MapStruct简介 MapStruct是一款基于Java注解的对象属性映射工具,在Github上已经有4.5K+Star。...合并映射 MapStruct也支持把多个对象属性映射到一个对象中去。...例如这里把Member和Order的部分属性映射到MemberOrderDto中去; /** * 会员商品信息组合Dto * Created by macro on 2021/10/21. */...return CommonResult.success(memberOrderDto); } } 在Swagger中调用接口测试下,可以发现Member和Order中的属性已经被映射到

    1.9K20

    NullException、Token的作用、Mapstruct用法

    Mapstruct用法初步学习 使用场景:将DTO转换成VO,DTO转成Entity等各类对象相互转换 官方介绍: Both types are rather similar, only the seat...private Integer field2; } } 同等解决方案:BeanUtils工具类的copyProperty以及调用getter/setter方法进行属性赋值 MapStruct...优点: 通过使用普通方法调用而不是反射来快速执行 编译时类型安全性:只能映射相互映射的对象和属性,不能将订单实体意外映射到客户DTO source:代表转换的源 target:代表转换的目标 MapStruct...:参考文章 使用MapStruct无法遵循isXXX命名规则,官方认为这个不是bug也不会为此做出改变。...MapStruct的Github关于无法遵循isXXX命名规则的 Issues

    1.4K42

    MapStruct才是王者!【附源码】

    这里的 @Mapper 注解不是 mybatis 的注解,而是 org.mapstruct.Mapper 的; 实际映射方法 carToCarDto() 期望源对象 Car 作为参数,并返回目标对象...CarDto ,方法名可以自由选择; 对于源对象和目标对象中具有不同名称的属性,可以使用 @Mapping 注释来配置名称; 对于源对象和目标对象中具有不同类型的属性,也可以使用 @Mapping 注释来进行转换...target:属性的目标名称,同一目标属性不能映射多次。如果用于映射枚举常量,则将给出常量成员的名称,在这种情况下,源枚举中的多个值可以映射到目标枚举的相同值。...constant:设置指定目标属性的常量字符串,当指定的目标属性的类型为:primitive 或 boxed(例如 Long)时,MapStruct 检查是否可以将该 primitive 作为有效的文本分配给...expression:是一个表达式,根据该表达式设置指定的目标属性。他的属性不能与 source、 defaultValue、defaultExpression、constant 一起使用。

    2K20

    MapStruct @Mapping注解:优雅处理映射中的Null值

    MapStruct作为一款强大的对象映射框架,通过简化映射代码的编写,提高了开发效率。然而,在实际应用中,我们经常面临源对象或目标对象中存在Null值的情况。...本文将深入探讨MapStruct中@Mapping注解的一些特性,特别是在映射过程中如何优雅处理Null值。 1....自定义Null值处理策略 除了使用默认值和设置目标对象字段为默认值之外,MapStruct还支持自定义Null值处理策略。...通过在@Mapper注解中配置nullValueCheckStrategy属性,我们可以指定一个自定义的策略类,来决定在映射过程中如何处理Null值。...在MapStruct中,隐式转换指的是在进行字段映射时,MapStruct会尝试自动进行类型转换,以适应目标对象字段的类型。

    2.1K10

    Java对象拷贝_对象的拷贝有几种方法

    与运行时工作的映射框架相比,MapStruct具有以下优点: 通过使用普通方法调用而不是反射来快速执行 编译时类型安全。只能映射彼此映射的对象和属性,因此不会将订单实体意外映射到客户DTO等。...目标对象必须先实例化 而且对象必须要有setter方法。...-- mapstruct end--> 转换: import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings...3.3 BeanCopier总结 当源类和目标类的属性名称、类型都相同,拷贝没问题。 当源对象和目标对象的属性名称相同、类型不同,那么名称相同而类型不同的属性不会被拷贝。...源类和目标类有相同的属性(两者的getter都存在),但是目标类的setter不存在,此时会抛出NullPointerException。

    4.9K10

    5种常见Bean映射工具的性能比对

    >jmapper-core 1.6.0.1 3.测试模型 为了能够正确地测试映射,我们需要有一个源和目标模型...简单的源模型如下: public class SourceCode { String code; // getter and setter } 它的目标也很相似: public class...private OrderStatus status; private LocalDate orderDate; // standard getters and setters } 目标类如下图所示...简单的模型测试 对于性能测试,我们可以使用 Java Microbenchmark Harness,关于如何使用它的更多信息可以在 这篇文章:https://www.baeldung.com/java-microbenchmark-harness...真实模型测试 对于性能测试,我们可以使用 Java Microbenchmark Harness,关于如何使用它的更多信息可以在 这篇文章:https://www.baeldung.com/java-microbenchmark-harness

    3.7K50

    MapStruct 才是王者!一文玩转 MapStruct 全场景【附源码】

    1MapStruct 什么是 MapStructMapStruct 是一个代码生成器,它基于约定优于配置方法,极大地简化了 Java bean 类型之间映射的实现。...MapStruct 常用的重要注解 : @Mapper 标记这个接口作为一个映射接口,并且是编译时 MapStruct 处理器的入口 @Mapping 解决源对象和目标对象中,属性名字不同的情况 @Mappings.../artifact/org.MapStruct/MapStruct-processor 1.3.1.Final</MapStruct.version...这里对转换接口再向上做一次抽象; 定义基础的转换接口 包含了最基本的4种转换方式 /** * 基础的对象转换Mapper * * @param 源对象 * @param 目标对象...country; private String province; private String city; } 测试需求 将UserDTO.addressDTO.country 属性映射到

    4.6K21

    分享一些简化定义和转换Java Bean的一些小技巧

    如果是类型转换 Bean类型转换的话,用Mapstruct就能解决这个问题,最终我们把属性名称定义为data: @Mapping(target = "data", source = "qrcode...关于Mapstruct可以看我相关的讲解文章。 如果是反序列化 Jackson提供了一个别名注解@JsonAlias,可以让字段属性名称接受更多的别名。...T> extends WeComResponse { @JsonAlias({"qrcode","userlist"}) private T data; } 那么下面这个json能映射到...OjbectResponse中: { "qrcode":"https://felord.cn/myqr.png" } 这个会映射到OjbectResponse<List<UserDetail...如何获取泛型的Class类型 通过直接手段是无法获取泛型的Class类型的,不过我们可以获取到泛型的抽象定义java.lang.reflect.ParameterizedType,直接使用ParameterizedType

    93620
    领券