效率提升-再次实践pojo的映射简化(mapStruct)

背景

之前写了一个mapStruct的Hello World,本wiki将再用一个实际项目中的例子来进行优化。

实现过程

创建一个spring boot项目

在这里插入图片描述
这里创建了一个MyApplicationRunner,方便我们调试bean

复制之前项目中的代码

我们先看一下两个需要转换的类。
ClassTaskPO.java

import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Timestamp;


/**
 * <p>Description: 班级任务持久化对象类</p>
 *
 * @author wang
 * @date 2018/10/22
 **/
@Data
@NoArgsConstructor
public class ClassTaskPO {
    private Long id;
    private Integer oldTaskId;
    private Long templateId;
    private String publisherId;
    private String publisherName;
    private String relation;
    private String classId;
    private String className;
    private String schoolId;
    private String userId;
    private Integer roleType;
    private Integer type;
    private String tags;
    private String title;
    private String image;
    private Integer imageWidth;
    private Integer imageHeight;
    private String coverImage;
    private Integer coverImageWidth;
    private Integer coverImageHeight;
    private String introduction;
    private String content;
    private String remarkContent;
    private Integer origin;
    private Integer totalCount;
    private Integer totalDay;
    private Timestamp startTime;
    private Timestamp endTime;
    private String submitEndTime;
    private Integer state;
    private String students;
    private Integer contentType;
    private Integer visibility;
    private Integer isDelete;
    private Integer isRemark;
    private Long remindTime;
    private Timestamp createTime;
    private Timestamp updateTime;

	// 直接在构造函数中写的转换,缺点是:即使属性名称相同,也得一个一个去写属性匹配(不留神丢一个,就尴尬了)
    public ClassTaskPO(ClassTaskWriteDTO classTaskWriteDTO) {
        templateId = classTaskWriteDTO.getTaskTemplateId();
        publisherId = classTaskWriteDTO.getPublisherId();
        // default配置
        publisherName = classTaskWriteDTO.getPublisherName() == null ? "" : classTaskWriteDTO.getPublisherName();
        relation = classTaskWriteDTO.getRelation();
        classId = classTaskWriteDTO.getClassId();
        className = classTaskWriteDTO.getClassName();
        userId = classTaskWriteDTO.getUserId();
        roleType = classTaskWriteDTO.getRoleType();
        schoolId = classTaskWriteDTO.getSchoolId();
        type = classTaskWriteDTO.getType();
        tags = classTaskWriteDTO.getTags();
        title = classTaskWriteDTO.getTitle();
        introduction = classTaskWriteDTO.getIntroduction();
        content = classTaskWriteDTO.getContent();
        remarkContent = classTaskWriteDTO.getRemarkContent();
        origin = classTaskWriteDTO.getOrigin();
        totalCount = classTaskWriteDTO.getTotalCount();
        totalDay = classTaskWriteDTO.getTotalDay();
        // 时间戳转换
        startTime = new Timestamp(classTaskWriteDTO.getStartTime());
        endTime = new Timestamp(classTaskWriteDTO.getEndTime());
        // 时间戳转换
        submitEndTime = classTaskWriteDTO.getSubmitEndTime();
        contentType = classTaskWriteDTO.getContentType();
        visibility = classTaskWriteDTO.getVisibility();
        // 时间戳转换
        startTime = new Timestamp(classTaskWriteDTO.getStartTime());
        state = classTaskWriteDTO.getState();
    }

    public ClassTaskPO(ClassTaskUpdateDTO classTaskUpdateDTO) {
        id = classTaskUpdateDTO.getTaskId();
        schoolId = classTaskUpdateDTO.getSchoolId();
        tags = classTaskUpdateDTO.getTags();
        title = classTaskUpdateDTO.getTitle();
        introduction = classTaskUpdateDTO.getIntroduction();
        content = classTaskUpdateDTO.getContent();
        submitEndTime = classTaskUpdateDTO.getSubmitEndTime();
        totalCount = classTaskUpdateDTO.getTaskTotalCount();
        totalDay = classTaskUpdateDTO.getTaskTotalDay();
        if (null != classTaskUpdateDTO.getStartTime()) {
            startTime = new Timestamp(classTaskUpdateDTO.getStartTime());
        }
        if (null != classTaskUpdateDTO.getEndTime()) {
            endTime = new Timestamp(classTaskUpdateDTO.getEndTime());
        }
    }

    public ClassTaskPO(ClassTaskDetail classTaskDetail, ClassTaskUpdateDTO classTaskUpdateDTO) {
        templateId = classTaskDetail.getTaskTemplateId();
        publisherId = classTaskDetail.getPublisherId();
        publisherName = classTaskDetail.getPublisherName() == null ? "" : classTaskDetail.getPublisherName();
        relation = classTaskDetail.getRelation();
        classId = classTaskDetail.getClassId();
        className = classTaskDetail.getClassName();
        userId = classTaskDetail.getUserId();
        roleType = classTaskDetail.getRoleType();
        schoolId = classTaskDetail.getSchoolId();
        type = classTaskDetail.getType();
        remarkContent = classTaskDetail.getRemarkContent();
        origin = classTaskDetail.getOrigin();
        contentType = classTaskDetail.getContentType();
        visibility = classTaskDetail.getVisibility();
        startTime = new Timestamp(classTaskDetail.getStartTime());
        state = classTaskDetail.getState();

        tags = classTaskUpdateDTO.getTags();
        title = classTaskUpdateDTO.getTitle();
        introduction = classTaskUpdateDTO.getIntroduction();
        content = classTaskUpdateDTO.getContent();
        startTime = new Timestamp(classTaskUpdateDTO.getStartTime());
        endTime = new Timestamp(classTaskUpdateDTO.getEndTime());
        submitEndTime = classTaskUpdateDTO.getSubmitEndTime();
        totalCount = classTaskUpdateDTO.getTaskTotalCount();
        totalDay = classTaskUpdateDTO.getTaskTotalDay();
    }
}

ClassTaskWriteDTO.java

import lombok.Data;

import java.io.Serializable;

/**
 * <p>Description: 班级任务写入传输对象</p>
 *
 * @author wang
 * @date 2018/11/12
 **/
@Data
public class ClassTaskWriteDTO implements Serializable {
    private static final long serialVersionUID = -5720405607273123914L;

    private Long taskTemplateId;
    /**
     * 发布者id
     */
    private String publisherId;
    /**
     * 发布者名称
     */
    private String publisherName;
    /**
     * 关系
     */
    private String relation;
    /**
     * 班级id
     */
    private String classId;
    /**
     * 班级名称
     */
    private String className;
    /**
     * 学校id
     */
    private String schoolId;
    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户类型
     */
    private Integer roleType;
    /**
     * 任务类型
     */
    private Integer type;
    /**
     * 任务标签
     */
    private String tags;
    /**
     * 标题
     */
    private String title;
    /**
     * 任务介绍
     */
    private String introduction;
    /**
     * 任务内容
     */
    private String content;
    /**
     * 点评
     */
    private String remarkContent;
    /**
     * 任务来源
     */
    private Integer origin;
    /**
     * 连续任务总次数
     */
    private Integer totalCount;
    /**
     * 连续任务总天数
     */
    private Integer totalDay;
    /**
     * 任务参与人数
     */
    private Integer participateCount;
    /**
     * 任务状态 0:进行中,1:已完成 2:已结束 3未开始
     */
    private Integer state;
    /**
     * 统一内容类型
     */
    private Integer contentType;
    private Integer visibility;
    /**
     * 任务开始时间
     */
    private Long startTime;
    /**
     * 任务结束时间
     */
    private Long endTime;
    /**
     * 打卡截止时间
     */
    private String submitEndTime;
}

可以看到,是使用构造函数实现了转换过程。下面进行改造,使用mapStruct进行转换。

使用mapStruct进行修改

添加pom文件依赖

<properties>
    <java.version>1.8</java.version>
    <mapstruct.version>1.3.1.Final</mapstruct.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependency>
     <groupId>org.mapstruct</groupId>
     <artifactId>mapstruct</artifactId>
     <version>${mapstruct.version}</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${mapstruct.version}</version>
</dependency>

添加代码

MyTransform.java,实现不同类型之间的转换

import org.springframework.stereotype.Component;

import java.sql.Timestamp;

@Component
public class MyTransform {
    public Timestamp longToTimestamp(Long t) {
        if (t != null) {
            return new Timestamp(t);
        }
        return null;
    }

    public Long timestampToLong(Timestamp timestamp) {
        if (timestamp != null) {
            return timestamp.getTime();
        }
        return null;
    }
}

添加映射类
MyMapper.java

import org.mapstruct.Mapper;

import java.sql.Timestamp;

@Mapper(
		// 在spring中使用,可以被Autowared
        componentModel = "spring",
        // 在生成的impl类中,添加import
        imports = Timestamp.class,
        // 使用转换类(转换类需要添加@Commponet)
        uses = {MyTransform.class}
)
public interface MyMapper {
    ClassTaskPO classTaskWriteDTOToClassTaskPO(ClassTaskWriteDTO classTaskWriteDTO);

    ClassTaskWriteDTO classTaskPOToClassTaskWriteDTO(ClassTaskPO classTaskPO);
}

在你ApplicationRunner中进行测试
在这里插入图片描述

自定生成的impl代码

import java.sql.Timestamp;
import javax.annotation.Generated;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2020-04-04T14:51:17+0800",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_111 (Oracle Corporation)"
)
@Component
public class MyMapperImpl implements MyMapper {

    @Autowired
    private MyTransform myTransform;

    @Override
    public ClassTaskPO classTaskWriteDTOToClassTaskPO(ClassTaskWriteDTO classTaskWriteDTO) {
        if ( classTaskWriteDTO == null ) {
            return null;
        }

        ClassTaskPO classTaskPO = new ClassTaskPO();

        classTaskPO.setPublisherId( classTaskWriteDTO.getPublisherId() );
        classTaskPO.setPublisherName( classTaskWriteDTO.getPublisherName() );
        classTaskPO.setRelation( classTaskWriteDTO.getRelation() );
        classTaskPO.setClassId( classTaskWriteDTO.getClassId() );
        classTaskPO.setClassName( classTaskWriteDTO.getClassName() );
        classTaskPO.setSchoolId( classTaskWriteDTO.getSchoolId() );
        classTaskPO.setUserId( classTaskWriteDTO.getUserId() );
        classTaskPO.setRoleType( classTaskWriteDTO.getRoleType() );
        classTaskPO.setType( classTaskWriteDTO.getType() );
        classTaskPO.setTags( classTaskWriteDTO.getTags() );
        classTaskPO.setTitle( classTaskWriteDTO.getTitle() );
        classTaskPO.setIntroduction( classTaskWriteDTO.getIntroduction() );
        classTaskPO.setContent( classTaskWriteDTO.getContent() );
        classTaskPO.setRemarkContent( classTaskWriteDTO.getRemarkContent() );
        classTaskPO.setOrigin( classTaskWriteDTO.getOrigin() );
        classTaskPO.setTotalCount( classTaskWriteDTO.getTotalCount() );
        classTaskPO.setTotalDay( classTaskWriteDTO.getTotalDay() );
        classTaskPO.setStartTime( myTransform.longToTimestamp( classTaskWriteDTO.getStartTime() ) );
        classTaskPO.setEndTime( myTransform.longToTimestamp( classTaskWriteDTO.getEndTime() ) );
        classTaskPO.setSubmitEndTime( classTaskWriteDTO.getSubmitEndTime() );
        classTaskPO.setState( classTaskWriteDTO.getState() );
        classTaskPO.setContentType( classTaskWriteDTO.getContentType() );
        classTaskPO.setVisibility( classTaskWriteDTO.getVisibility() );

        return classTaskPO;
    }

    @Override
    public ClassTaskWriteDTO classTaskPOToClassTaskWriteDTO(ClassTaskPO classTaskPO) {
        if ( classTaskPO == null ) {
            return null;
        }

        ClassTaskWriteDTO classTaskWriteDTO = new ClassTaskWriteDTO();

        classTaskWriteDTO.setPublisherId( classTaskPO.getPublisherId() );
        classTaskWriteDTO.setPublisherName( classTaskPO.getPublisherName() );
        classTaskWriteDTO.setRelation( classTaskPO.getRelation() );
        classTaskWriteDTO.setClassId( classTaskPO.getClassId() );
        classTaskWriteDTO.setClassName( classTaskPO.getClassName() );
        classTaskWriteDTO.setSchoolId( classTaskPO.getSchoolId() );
        classTaskWriteDTO.setUserId( classTaskPO.getUserId() );
        classTaskWriteDTO.setRoleType( classTaskPO.getRoleType() );
        classTaskWriteDTO.setType( classTaskPO.getType() );
        classTaskWriteDTO.setTags( classTaskPO.getTags() );
        classTaskWriteDTO.setTitle( classTaskPO.getTitle() );
        classTaskWriteDTO.setIntroduction( classTaskPO.getIntroduction() );
        classTaskWriteDTO.setContent( classTaskPO.getContent() );
        classTaskWriteDTO.setRemarkContent( classTaskPO.getRemarkContent() );
        classTaskWriteDTO.setOrigin( classTaskPO.getOrigin() );
        classTaskWriteDTO.setTotalCount( classTaskPO.getTotalCount() );
        classTaskWriteDTO.setTotalDay( classTaskPO.getTotalDay() );
        classTaskWriteDTO.setState( classTaskPO.getState() );
        classTaskWriteDTO.setContentType( classTaskPO.getContentType() );
        classTaskWriteDTO.setVisibility( classTaskPO.getVisibility() );
        classTaskWriteDTO.setStartTime( myTransform.timestampToLong( classTaskPO.getStartTime() ) );
        classTaskWriteDTO.setEndTime( myTransform.timestampToLong( classTaskPO.getEndTime() ) );
        classTaskWriteDTO.setSubmitEndTime( classTaskPO.getSubmitEndTime() );

        return classTaskWriteDTO;
    }
}

不用自己去写每个属性,只需要写一下mapper,如果需要的话,写一个通用的transform即可

评价

  • 不用再去一个个属性的去写,以免丢失
  • 可以自己定义属性变化
  • 可以在spring中使用mapStruct
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章