背景
之前写了一个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