在实际开发中,我们经常会遇到需要对VO,DTO,DO,VO,PO等类型的属性拷贝问题,而我们常用的方法是使用apache.Beanutils来对这些实体进行拷贝,而这样拷贝会存在List无法拷贝问题或者是性能的问题等等。
虽然目前还有其他几种常用的工具类可以用作属性拷贝,但是本文主要讲解mapstruct如何使用,因此,本文中就不过多赘述了。
mapstruct是一种性能比较高并且书写较为方便的属性拷贝方法。
maven配置
1.首先我们得现在maven中配置好相关依赖,需要注意的是使用该方法的前提应先添加lombok依赖,如下:
<!-- 注意:以下依赖如果不添加,则会存在编译报错问题 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
<!-- --------------------------------------- -->
<!-- mapstruct配置 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
实例演示
2.为了方便理解,以下通过一个简单的例子进行演示,方便大家理解。
School.class
public class School {
/**
* 学校id
*/
private Long schoolId;
/**
* 学校名称
*/
private String schoolName;
/**
* 校长实体
*/
private Headmaster headmaster;
}
Headmaster.class
public class Headmaster{
/**
* 学校id
*/
private Long schoolId;
/**
* 校长名称
*/
private String name;
}
SchoolVO
public class School {
/**
* 学校id
*/
private Long schoolId;
/**
* 学校名称
*/
private String schoolName;
/**
* 校长名称
*/
private String headmasterName;
}
我们需要根据业务新增接口,来对实体进行转换
//import ......
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
//注意:此@Mapper并非spring中的@Mapper注解,切勿弄混
@Mapper
public interface SchoolToMapping {
/**
* 获取该类自动生成的实现类的实例(在调用时会用到)
*/
SchoolToMapping INSTANCES = Mappers.getMapper(SchoolToMapping.class);
@Mappings({
@Mapping(source = "headmaster.name", target = "headmasterName")
})
SchoolVO toVO(School school);
List<SchoolVO> toVOList(List<School> list);
}
以下则是正常业务类
@Service
public class SchoolServiceImpl implements ISchoolService {
@Autowired
private SchoolMapper schoolMapper;
public SchoolVO selectArticleInfoList(School school){
SchoolMapper instances = SchoolToMapper.INSTANCES;
SchoolVO schoolVO = instances.toVO(school)
return schoolVO;
}
}