MapStruct를 만난 후 PO, DTO, VO 대상 사이의 전환을 손으로 쓰지 않습니다
7151 단어 설계자가 성장하는 길
업무 중에 우리는 자주 각종 대상 간의 전환을 진행해야 한다고 소개한다.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 학습과 발전의 건더기를 함께 나눈다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
지속적인 통합 - 엔트리에서 xxx까지centos7+docker+jenkins+svn 기반 지속적 통합 플랫폼 구축 자원 버전 제어 서버 매번 조작마다 데이터를 찾을 수 있어서 코드가 어쨌든 사용 가능한 상태로 돌아갈 수 있다 git에 비해 제출 코드는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.