概述
现代软件开发基本都基于分层架构下进行的,而在分层结构下,不同的层会有不同的bean,由于业务需要不同的bean在不同的层中其方法和命名总不能同时保持一致,在不同的层中会涉及到不同bean的转换,如果每次都用set/get方法,总会显得繁琐,而MapStruct框架就为解决不同bean之间的转换提供了很好的解决方案,使用MapStruct可以轻松的在不同bean之间转换
案例
转换接口,只需要简单的配置,引入@Mapper注解,配置source和target,就可以将Student的name属性映射到StudentDTO中的studentname属性了
@Mapper
public interface StudentConverter {
StudentConverter INSTANCE = Mappers.getMapper(StudentConverter.class);
@Mappings(@Mapping(source = "sname", target = "studentname"))
StudentDTO do2dto(Student student);
}
测试
可以看到我们完成了映射
源类: Student
@TableName("STUDENT")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 学号
*/
@TableId("SID")
private String sid;
/**
* 姓名
*/
@TableField("SNAME")
private String sname;
/**
* 年级
*/
@TableField("SGRADE")
private String sgrade;
/**
* 班级
*/
@TableField("SCLASS")
private String sclass;
@TableField("COUNT_TIME")
private LocalDateTime countTime;
@TableField("PIC_PATH")
private String picPath;
public void setSid(String sid) {
this.sid = sid;
}
public void setSname(String sname) {
this.sname = sname;
}
public void setSgrade(String sgrade) {
this.sgrade = sgrade;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
public void setCountTime(LocalDateTime countTime) {
this.countTime = countTime;
}
public void setPicPath(String picPath) {
this.picPath = picPath;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getSid() {
return sid;
}
public String getSname() {
return sname;
}
public String getSgrade() {
return sgrade;
}
public String getSclass() {
return sclass;
}
public LocalDateTime getCountTime() {
return countTime;
}
public String getPicPath() {
return picPath;
}
@Override
public String toString() {
return "Student{" +
"sid='" + sid + '\'' +
", sname='" + sname + '\'' +
", sgrade='" + sgrade + '\'' +
", sclass='" + sclass + '\'' +
", countTime=" + countTime +
", picPath='" + picPath + '\'' +
'}';
}
}
转换类 StudentDTO
public class StudentDTO {
/**
* 学号
*/
@TableId("SID")
private String sid;
/**
* 姓名
*/
@TableField("SNAME")
private String studentname;
/**
* 年级
*/
@TableField("SGRADE")
private String sgrade;
/**
* 班级
*/
@TableField("SCLASS")
private String sclass;
@TableField("COUNT_TIME")
private LocalDateTime countTime;
@TableField("PIC_PATH")
private String picPath;
public void setSid(String sid) {
this.sid = sid;
}
public void setStudentname(String studentname) {
this.studentname = studentname;
}
public void setSgrade(String sgrade) {
this.sgrade = sgrade;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
public void setCountTime(LocalDateTime countTime) {
this.countTime = countTime;
}
public void setPicPath(String picPath) {
this.picPath = picPath;
}
public String getSid() {
return sid;
}
public String getStudentname() {
return studentname;
}
public String getSgrade() {
return sgrade;
}
public String getSclass() {
return sclass;
}
public LocalDateTime getCountTime() {
return countTime;
}
public String getPicPath() {
return picPath;
}
@Override
public String toString() {
return "StudentDTO{" +
"sid='" + sid + '\'' +
", studentname='" + studentname + '\'' +
", sgrade='" + sgrade + '\'' +
", sclass='" + sclass + '\'' +
", countTime=" + countTime +
", picPath='" + picPath + '\'' +
'}';
}
}
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- depending on your project -->
<target>1.8</target> <!-- depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>