MapStruct를 만난 후 PO, DTO, VO 대상 사이의 전환을 손으로 쓰지 않습니다

MapStruct를 만나면 PO, DTO, VO 대상 사이의 전환을 손으로 쓰지 않습니다.
업무 중에 우리는 자주 각종 대상 간의 전환을 진행해야 한다고 소개한다.PO:persistent object 영구 대상, 데이터베이스에 기록된 VO:view object 표현층 대상에 대응하여 최종적으로 전방의 대상인 DTO:data transfer object 데이터 전송 대상, 예를 들어dubbo 서비스 간에 전송된 대상의 속성 이름이 같으면 다음과 같은 도구 클래스로 값을 부여할 수 있습니다. Spring BeanUtils Cglib BeanCopier는 Apache BeanUtils를 사용하지 않습니다.성능이 떨어지는데 속성명이 다르면?여러 PO 객체를 하나의 VO 객체로 병합하는 경우는?다행히도 MapStruct 신기가 있어pom 파일에 다음과 같은 의존을 빠르게 변환할 수 있도록 도와주면 된다
>
    >org.mapstruct>
    >mapstruct-jdk8>
    >1.2.0.CR1>
>
>
    >org.mapstruct>
    >mapstruct-processor>
    >1.2.0.CR1>
    >provided>
>

대상 상호 전환
@Data
@Builder
public class StudentPO {
    private Integer id;
    private String name;
    private Integer age;
    private String className;
}
@Data
public class StudentVO {
    private Integer id;
    private String studentName;
    private Integer studentAge;
    private String schoolName;
}
@Mapper
public interface StudentMapper {
    StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);
    @Mappings({
            @Mapping(source = "name", target = "studentName"),
            @Mapping(source = "age", target = "studentAge")
    })
    StudentVO po2Vo(StudentPO studentPO);
}

1. 새 Mapper 인터페이스를 만들고 @Mapper 주석을 붙인다.새 구성원 변수 INSTANCE 1.@Mapping 주석으로 맵 관계를 지정하면 이름이 같으면 더 이상 지정할 필요가 없습니다. 자동으로 맵 테스트 효과는 다음과 같습니다. 이름이 다르고 맵 관계가 지정되지 않은 것은null로 설정됩니다.
@Test
public void studentPo2Vo() {
    StudentPO studentPO = StudentPO.builder().id(10).name("test")
            .age(24).className("   ").build();
    StudentVO studentVO = StudentMapper.INSTANCE.po2Vo(studentPO);
    // StudentVO(id=10, studentName=test, studentAge=24, schoolName=null)
    System.out.println(studentVO);
}

List 상호 전환
@Mapper
public interface StudentMapper {
    StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);
    @Mappings({
            @Mapping(source = "name", target = "studentName"),
            @Mapping(source = "age", target = "studentAge")
    })
    StudentVO po2Vo(StudentPO studentPO);
    List> poList2VoList(List> studentPO);
}

List 유형이 서로 회전하는 매핑 규칙은 단일 객체의 매핑 규칙을 사용하여 테스트 결과를 확인합니다.
@Test
public void poList2VoList() {
    List> studentPOList = new ArrayList<>();
    for (int i = 1; i <= 2; i++) {
        StudentPO studentPO = StudentPO.builder().id(i).name(String.valueOf(i)).age(i).build();
        studentPOList.add(studentPO);
    }
    List> studentVOList = StudentMapper.INSTANCE.poList2VoList(studentPOList);
    // [StudentVO(id=1, studentName=1, studentAge=1, schoolName=null),
    // StudentVO(id=2, studentName=2, studentAge=2, schoolName=null)]
    System.out.println(studentVOList);
}

여러 개의 대상이 한 대상을 비추는데 우리는 SchoolPO와 StudentPO로 SchoolStudentVO를 비추겠습니다
@Data
@Builder
public class SchoolPO {
    private String name;
    private String location;
}
@Data
@Builder
public class StudentPO {
    private Integer id;
    private String name;
    private Integer age;
    private String className;
}

@Data
public class SchoolStudentVO {
    private String schoolName;
    private String studentName;
}
@Mapper
public interface StudentMapper {
    @Mappings({
            @Mapping(source = "schoolPO.name", target = "schoolName"),
            @Mapping(source = "studentPO.name", target = "studentName")
    })
    SchoolStudentVO mergeVo(SchoolPO schoolPO, StudentPO studentPO);
}

테스트 예는 다음과 같다.
@Test
public void mergeVo() {
    SchoolPO schoolPO = SchoolPO.builder().name("    ").build();
    StudentPO studentPO = StudentPO.builder().name("    ").build();
    SchoolStudentVO schoolStudentVO = StudentMapper.INSTANCE.mergeVo(schoolPO, studentPO);
    // SchoolStudentVO(schoolName=    , studentName=    )
    System.out.println(schoolStudentVO);
}

물론 다른 조작도 있다. 여기서 비교적 실용적인 기교를 간단하게 소개하고 관심 있는 것은 정부의 example을 볼 수 있다.https://github.com/mapstruct/mapstruct-examples
더 많은 건화물 자원은 작가의 칼럼을 주목해 주십시오.
댓글로'좋아요'팔로우, AI 학습과 발전의 건더기를 함께 나눈다.

좋은 웹페이지 즐겨찾기