首页 > 其他分享 >MapStruct高级用法

MapStruct高级用法

时间:2024-06-02 09:29:35浏览次数:13  
标签:customerDto target MapStruct class Mapping 高级 source 用法 public

MapStruct高级用法

  1. 依赖注入(Using dependency injection)

    @Mapper(componentModel = SPRING)
    public interface SpringMapper {
        SpringMapper MAPPER = Mappers.getMapper(SpringMapper.class);
    
        PersonDTO personDoToDTO(Person person);
    }
    
    public static final class ComponentModel {
        private ComponentModel() {
        }
        public static final String DEFAULT = "default";
        public static final String CDI = "cdi";
        public static final String SPRING = "spring";
        public static final String JSR330 = "jsr330";
        public static final String JAKARTA = "jakarta";
    }
    

    示例代码:com.yxxmg.mapstruct.convert.SpringMapper

  2. 组合多个映射

    @Mapper(imports = Date.class)
    public interface PersonMapper {
        PersonMapper MAPPER = Mappers.getMapper(PersonMapper.class);
    
        @Mapping(target = "personName", source = "name")
        @Mapping(target = "id", ignore = true)
        // 忽略id,不进行映射
        PersonDTO personDoToDTO(Person person);
    
        @Mapping(target = "personName", source = "name") // 指定映射
        @Mapping(target = "describe", source = "describe", defaultValue = "默认值") // 设置默认值
        @Mapping(target = "updateDate", expression = "java(new java.util.Date())") // 表达式 java
        @Mapping(target = "modifyDate", expression = "java(new Date())")
        @Mapping(target = "createDate", source = "createTime", dateFormat = "YYYY-MM-DD") // 格式化
        @Mapping(source = "source", target = "source", numberFormat = "#0.00")
        PersonDTO convert2(Person person);
    }
    

    示例代码:com.yxxmg.mapstruct.convert.PersonMapper

  3. 嵌套对象属性映射

     @Mapper
     public interface CustomerMapper {
    
         @Mapping( target = "name", source = "record.name" )
         @Mapping( target = ".", source = "record" )
         @Mapping( target = ".", source = "account" )
         Customer customerDtoToCustomer(CustomerDto customerDto);
     }
    
  4. 迭代器以及参数传递

    使用@IterableMapping@Context

    @Mapper
    public interface MenuMapper {
        MenuMapper MAPPER = Mappers.getMapper(MenuMapper.class);
    
        @Mapping(target = "parentId", source = "parentId")
        Menu convert(String parentId, MenuDTO menuDTO);
    
        @IterableMapping(qualifiedByName = "convertDTO")
        List<Menu> convert(@Context String parentId, List<MenuDTO> menuDTOList);
    
        @Named("convertDTO")
        default Menu convertDTO(@Context String parentId, MenuDTO menuDTO) {
            return convert(parentId, menuDTO);
        }
    
    

    示例代码:com.yxxmg.mapstruct.convert.MenuMapper

  5. 隐式转换

    例如可以定义默认方法将枚举转换成字符串或者数值,所有枚举字段会自动隐式转换,上述的例子中已经体现,就不举例说明

  6. 映射参数到目标对象上@MappingTarget

    @Mapper
    public interface SourceTargetMapper {
        SourceTargetMapper MAPPER = Mappers.getMapper(SourceTargetMapper.class);
    
        void toEntity(ParentDto s, @MappingTarget ParentEntity t);
    
        @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
        interface LenientMapper {
    
            void toEntity(ChildDto s, @MappingTarget ChildEntity t);
        }
    }
    

    示例代码:com.yxxmg.mapstruct.mappingtarget.SourceTargetMapper

  7. 深克隆

    @Mapper(mappingControl = DeepClone.class)
    public interface Cloner {
        Cloner MAPPER = Mappers.getMapper(Cloner.class);
    
        CustomerDto clone(CustomerDto customerDto);
    }
    

    编译后

    @Generated(
        value = "org.mapstruct.ap.MappingProcessor",
        date = "2024-05-30T09:22:14+0800",
        comments = "version: 1.5.0.RC1, compiler: javac, environment: Java 1.8.0_401 (Oracle Corporation)"
    )
    public class ClonerImpl implements Cloner {
    
        @Override
        public CustomerDto clone(CustomerDto customerDto) {
            if ( customerDto == null ) {
                return null;
            }
    
            CustomerDto customerDto1 = new CustomerDto();
    
            customerDto1.setId( customerDto.getId() );
            customerDto1.setCustomerName( customerDto.getCustomerName() );
            customerDto1.setOrders( orderItemDtoListToOrderItemDtoList( customerDto.getOrders() ) );
            customerDto1.setStock( orderItemKeyDtoOrderItemDtoMapToOrderItemKeyDtoOrderItemDtoMap( customerDto.getStock() ) );
    
            return customerDto1;
        }
    
        protected OrderItemDto orderItemDtoToOrderItemDto(OrderItemDto orderItemDto) {
            if ( orderItemDto == null ) {
                return null;
            }
    
            OrderItemDto orderItemDto1 = new OrderItemDto();
    
            orderItemDto1.setName( orderItemDto.getName() );
            orderItemDto1.setQuantity( orderItemDto.getQuantity() );
    
            return orderItemDto1;
        }
    
        protected List<OrderItemDto> orderItemDtoListToOrderItemDtoList(List<OrderItemDto> list) {
            if ( list == null ) {
                return null;
            }
    
            List<OrderItemDto> list1 = new ArrayList<OrderItemDto>( list.size() );
            for ( OrderItemDto orderItemDto : list ) {
                list1.add( orderItemDtoToOrderItemDto( orderItemDto ) );
            }
    
            return list1;
        }
    

    示例代码:com.yxxmg.mapstruct.clone.mapper.Cloner

  8. 后续发现其他高级特性待补充…
    示例代码相关地址

    https://gitee.com/youxiaxiaomage/java-practices

标签:customerDto,target,MapStruct,class,Mapping,高级,source,用法,public
From: https://blog.csdn.net/youxiaxiaomage/article/details/139282495

相关文章

  • 杂项——STM32ZET6要注意的一些问题——高级定时器问题和PB3,PB4引脚问题
    ZET6可能会用到定时器,高级定时器要输出PWM要加上这样一行代码,否则无法正常输出PWM波TIM_CtrlPWMOutputs(TIM8,ENABLE); //主输出使能,当使用的是通用定时器时,这句不需要ZET6中PB3,PB4引脚默认功能是JTDO和NJTRST,如果想将其当作正常IO口使用需要加上两行代码 RCC_APB2Pe......
  • MapStruct的介绍及入门使用
    一、痛点  代码中存在很多JavaBean之间的转换,编写映射转化代码是一个繁琐重复还易出错的工作。使用BeanUtils工具时,对于字段名不一致和嵌套类型不一致时,需要手动编写。并且基于反射,对性能有一定开销。Spring提供的BeanUtils针对apache的BeanUtils做了很多优化,整体性能提升了不......
  • C++高级编程之——函数重载、内联、缺省参数、隐式转换
    C++函数的高级特性对比于C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免......
  • Angular 18+ 高级教程 – Coding Style Guide 编码风格
    前言Angular从v14开始大改特改,改最多的就是编码风格。以前偏向classfirst,@Decoratorfirst,mutablefirst。现在偏向functionfirst,immutablefirst。本篇主要是探讨v14后,尤其是Signal后的Angular编码风格,看看怎么写会比较合理舒服......
  • 第2讲:static用法总结
    几句话总结static的用法。1、静态变量(1)静态变量统一放在特定内存区域中,在程序的整个生命周期内只有一份,所以函数在使用时共用静态变量的状态。(2)类中的静态变量为类的所有对象共享,而且不能在类内初始化静态变量。原因:每个对象是独立的,如果可以通过对象的方式初始化静态变......
  • 长序列中Transformers的高级注意力机制总结
    在处理长序列时,Transformers面临着注意力分散和噪音增加等挑战。随着序列长度的增长,每个词元必须与更多词元竞争注意力得分,这会导致注意力分数被稀释。这种稀释可能导致不那么集中和相关的上下文表示,特别是影响彼此距离较远的词元。并且较长的序列更有可能包含不相关或不太相关的......
  • 软考高级架构师/分析师论文【论基于架构的软件设计方法/ABSD】
    一、摘要  2020年4月,某互联网公司开始了基础架构管理平台项目的实施,该项目主要为基础架构团队提供基础设施、中间件、负载均衡、任务管理等功能,我作为该项目的架构师,主要负责架构设计、架构评估等工作。本文以该项目为例,主要论述基于架构的软件设计方法在该项目中的具体......
  • 【网络】高级IO(select||poll||epoll)
    基础引入应用层read&&write的时候,把数据从用户层写到操作系统,本质是拷贝函数。read时候如果缓冲区没有数据,那么就要等待数据才能读取,因此IO=等待+拷贝,要进行拷贝,必须等待读写事件就绪。高效IO指单位时间内,IO过程中,等待的比重小,IO效率高。五种IO模型同步阻塞IO(BlockingIO......
  • python-argparse用法简介
    1.argparse介绍argparse是Python标准库中用于解析命令行参数的模块。它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数)2.argparse基本使用点击查看代码importargparse#1.创建ArgumentParser对象,在创建ArgumentParser对象时,可以传入......
  • Java面试进阶指南:高级问题与解答精粹(一)
    Java面试问题及答案1.什么是Java内存模型(JMM)?它的作用是什么?答案:Java内存模型(JMM)是一个抽象的概念,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下如何保证这些变量的可见性、原子性和有序性。JMM的作用是确保在并发编程中,不同线程之间对共享变量的操......