# mapstruct-examplas **Repository Path**: F1yBear/mapstruct-examplas ## Basic Information - **Project Name**: mapstruct-examplas - **Description**: mapstruct使用实战 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-17 - **Last Updated**: 2023-02-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## mapstruct入门 ## 功能 对象属性映射 ## 技术选型 | 产品 | Dozer | Orika |MapStruct | CGLib BeanCopier |Spring BeanUtils |Apache BeanUtils | | --- |---| --- | --- | --- | --- | ---| |GitHub |dozer 1.9K stars |orika 1.2K stars|mapstruct 5K stars|cglib 4.3K stars| - |commons-beanutils 0.2K stars| |工作原理|大量反射,主要基于Field.set(obj, obj)为field赋值| 基于javassist生成对象映射字节码,并加载生成的字节码文件 |基于JSR269,在在编译期生成对象映射代码 |基于ASM的MethodVisitor为field赋值 |基于Spring反射工具类|基于反射| |性能排名|5|2|1|4|3|6| ## 原理 >利用 [jsr269](https://jcp.org/en/jsr/detail?id=269) 通过注解在编译源码前编译被插入式注解控制的逻辑为class文件。通过牺牲一点点编译期的性能来提高运行时的效率或提高编写代码的效率。 ## 使用示例 ```java @Mapper public interface OrderMapper { OrderMapper MAPPER = Mappers.getMapper(OrderMapper.class); /** * 一对一简单映射 * 1. 映射条件 属性名相同,有get set方法 * 2. 类型不同会默认做类型转化 * * @param orderDO * @return */ OrderDTO convert(OrderDO orderDO); /** * 一对一类型映射 * @param orderDO * @return */ @Mappings( value ={ @Mapping(source="productName",target = "goodsName"), @Mapping(source="createTime",target = "createTime",dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source="updateTime",target = "updateTime",dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(target = "buyNum",expression = "java(java.lang.String.valueOf(orderDO.getBuyNum()))") } ) OrderVO convert2(OrderDO orderDO); /** * 一对多类型映射 * @param orderDO * @return */ @Mappings( value ={ @Mapping(source="orderDO.productName",target = "goodsName"), @Mapping(source="orderDO.createTime",target = "createTime",dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source="orderDO.updateTime",target = "updateTime",dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source="orderDO.orderNo",target = "orderNo",dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source="orderDO.orderType",target = "orderType"), @Mapping(target = "orderDO.buyNum",expression = "java(java.lang.String.valueOf(orderDO.getBuyNum()))") } ) OrderVO convert3(OrderDO orderDO,OrderDTO orderDTO); /** * 不创建新对象,更新orderDTO属性 * @param orderDO * @return */ void convert4(@MappingTarget OrderDTO orderDTO, OrderDO orderDO); /** * 自己写转化 * @param orderDO * @return */ default void convert5(OrderDTO orderDTO, OrderDO orderDO){ } } ``` ## 踩坑 * mapstruct 与 lombok 同时使用要让lombok先进行编译 ```xml ${project.artifactId}-${project.version} org.apache.maven.plugins maven-compiler-plugin 3.10.1 org.projectlombok lombok ${org.projectlombok.version} org.mapstruct mapstruct-processor ${org.mapstruct.version} ``` * mapstruct可能导致编译异常,在使用新规则建议看下生成的class代码