MapStruct高级用法

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

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游侠小马哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值