springboot+mapstruct初尝试

在日常开发中,是不是经常遇到实体转换的需求,敲实体转换的代码让人头疼又无奈,特别是字段多的时候,常用的工具有BeanUtils,下面尝试一个开源项目mapstruct,可以轻松优雅的对PO、VO、DTO进行转换。
mapstruct是一种实体类映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。
实例

	
        1.8
        1.4.1.Final
        1.18.12
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.mapstruct
            mapstruct
            ${org.mapstruct.version}
        
        
            org.mapstruct
            mapstruct-processor
            ${org.mapstruct.version}
        
        
            org.projectlombok
            lombok
            ${org.projectlombok.version}
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    1.8
                    1.8
                    
                        
                            org.projectlombok
                            lombok
                            ${org.projectlombok.version}
                        
                        
                            org.mapstruct
                            mapstruct-processor
                            ${org.mapstruct.version}
                        
                    
                
            
        
    

关于lombok和mapstruct的版本兼容问题多说几句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外编译的lombok mapstruct的插件不要忘了加上。
实体

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private String name;
    private int age;
    private GenderEnum gender;
    private Double height;
    private Date birthday;

}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Course {

    private String courseName;
    private int sortNo;
    private long id;

}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StudentVO {

    private String name;
    private int age;
    private String gender;
    private Double height;
    private String birthday;

    private String course;
}

枚举

public enum GenderEnum {
    Male("1", "男"),
    Female("0", "女");

    private String code;
    private String name;

    public String getCode() {
        return this.code;
    }

    public String getName() {
        return this.name;
    }

    GenderEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
}

实体转换

@Mapper
public interface StudentConverter {

    StudentConverter INSTANCE = Mappers.getMapper(StudentConverter.class);

    @Mapping(source = "student.gender.name", target = "gender")
    @Mapping(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")
    StudentVO student2StudentVO(Student student);

    @Mapping(source = "student.gender.name", target = "gender")
    @Mapping(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Mapping(source = "course.courseName", target = "course")
    StudentVO studentAndCourse2StudentVO(Student student, Course course);

    List students2StudentVOs(List studentList);

}

实体类的代码编写是少不了的,就算是用工具生成也肯定是要有的,需要编写的部分就算这个converter接口,编译完成后会自动生成相应的实现类。
测试

	@Test
    void contextLoads() {
        Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();
        System.out.println(student);
        //这行代码便是实际要用的代码
        StudentVO studentVO = StudentConverter.INSTANCE.student2StudentVO(student);
        System.out.println(studentVO);
    }

    @Test
    void test1() {
        Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();
        System.out.println(student);
        List list = new ArrayList<>();
        list.add(student);
        List result = StudentConverter.INSTANCE.students2StudentVOs(list);
        System.out.println(result);
    }

    @Test
    void test2() {
        Student student = Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();
        Course course = Course.builder().id(1L).courseName("语文").build();
        StudentVO studentVO = StudentConverter.INSTANCE.studentAndCourse2StudentVO(student, course);
        System.out.println(studentVO);
    }

converter可以进行字段映射,改变字段类型,指定格式化的方式,包括一些日期的处理,List类型转换,多个对象转换到一个对象。
测试结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还需深入理解其实现原理,加油吧,少年。

你可能感兴趣的:(springboot,spring,boot,mapstruct)