mapstruct的官方网站链接https://mapstruct.org/
idea有mapstruct插件,可以安装下

快速开始

引入pom依赖

我的项目使用了lombok,将lombok和mapstruct配合使用。

  1. <dependency>
  2. <groupId>org.mapstruct</groupId>
  3. <artifactId>mapstruct</artifactId>
  4. <version>1.4.1.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mapstruct</groupId>
  8. <artifactId>mapstruct-processor</artifactId>
  9. <version>1.4.1.Final</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. <version>1.18.12</version>
  15. </dependency>
  16. <plugin>
  17. <groupId>org.apache.maven.plugins</groupId>
  18. <artifactId>maven-compiler-plugin</artifactId>
  19. <version>3.8.1</version>
  20. <configuration>
  21. <source>1.8</source>
  22. <target>1.8</target>
  23. <encoding>UTF-8</encoding>
  24. <annotationProcessorPaths>
  25. <path>
  26. <groupId>org.mapstruct</groupId>
  27. <artifactId>mapstruct-processor</artifactId>
  28. <version>${mapstruct.version}</version>
  29. </path>
  30. <path>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. <version>${lombok.version}</version>
  34. </path>
  35. <!-- other annotation processors -->
  36. </annotationProcessorPaths>
  37. </configuration>
  38. </plugin>

创建entity和dto

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class Car {
  5. private String make;
  6. private Integer numberOfSeats;
  7. private Integer type;
  8. }
  9. @Data
  10. public class CarDto {
  11. private String make;
  12. private int seatCount;
  13. private String type;
  14. }

声明mapper接口

转换规则

  • 字段类型和名称一致,无需映射
  • 名称不一致需要映射
  • 名称一致类型不一致的情况需要看下mapstruct支不支持,不支持需要自定义转换器

    1. @Mapper
    2. public interface CarMapper {
    3. CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
    4. @Mapping(source = "numberOfSeats", target = "seatCount")
    5. CarDto carToCarDto(Car car);
    6. }

    执行转换

    1. public class CarTest {
    2. @Test
    3. public void test_converter() {
    4. //given
    5. Car car = new Car("Morris", 5, 10);
    6. //when
    7. CarDto carDto = CarMapper.INSTANCE.carToCarDto(car);
    8. //then
    9. System.out.println(carDto.getMake());
    10. System.out.println(carDto.getSeatCount());
    11. System.out.println(carDto.getType());
    12. }
    13. }

    结合DDD

    在父pom引入依赖声明,client引入jar包

    dto和entity转换

    ```java public interface Assembler { /**

    • 将entity转为dto *
    • @param entity 领域实体
    • @return dto */ Dto convertToDto(Entity entity);

      /**

    • 将dto转为entity *
    • @param dto 数据传输对象
    • @return 领域实体 */ Entity convertToEntity(Dto dto); }

@Mapper(uses = DateMapper.class) public interface DictDetailAssembler extends Assembler { DictDetailAssembler INSTANCE = Mappers.getMapper(DictDetailAssembler.class);

  1. @Mappings({@Mapping(source = "id", target = "seqNo"),
  2. @Mapping(source = "dictName", target = "name"),
  3. @Mapping(source = "dictType", target = "type"),
  4. @Mapping(source = "createTime", target = "createTime")})
  5. DictDetailItem convertToDto(DictDetail dictDetail);
  6. @Mappings({@Mapping(source = "seqNo", target = "id"),
  7. @Mapping(source = "name", target = "dictName"),
  8. @Mapping(source = "type", target = "dictType")})
  9. DictDetail convertToEntity(DictDetailItem dictDetailItem);

}

  1. <a name="fAXE8"></a>
  2. ## DO和entity转换
  3. ```java
  4. public interface Converter<DO, Entity> {
  5. /**
  6. * 将entity转为DO
  7. *
  8. * @param entity 领域实体
  9. * @return dto
  10. */
  11. DO convertToDO(Entity entity);
  12. /**
  13. * 将DO转为entity
  14. *
  15. * @param Do 数据库传输对象
  16. * @return 领域实体
  17. */
  18. Entity convertToEntity(DO Do);
  19. }
  20. @Mapper
  21. public interface DictDetailConverter extends Converter<DictDetailDO, DictDetail> {
  22. DictDetailConverter INSTANCE = Mappers.getMapper(DictDetailConverter.class);
  23. DictDetailDO convertToDO(DictDetail dictDetail);
  24. DictDetail convertToEntity(DictDetailDO dictDetailDO);
  25. }

自定义转换器

比如有个entity的createTime是timetamp类型的,dto的createTime是string类型的,直接映射会报错的

添加转换器

  1. public class DateMapper {
  2. public String asString(Date date) {
  3. return date != null ? new SimpleDateFormat(QmsConstant.YYYYMMDDHHMMSS)
  4. .format(date) : null;
  5. }
  6. public Date asDate(String date) {
  7. try {
  8. return date != null ? new SimpleDateFormat(QmsConstant.YYYYMMDDHHMMSS)
  9. .parse(date) : null;
  10. } catch (ParseException e) {
  11. throw new RuntimeException(e);
  12. }
  13. }
  14. }

mapper声明转换器

uses是数组可以声明多个

  1. @Mapper(uses = DateMapper.class)