背景
在实际开发过程中,我们通常会用到Po、Dto、Vo、Qo、Bo等各个不同类型的对象,所以就会产生各个不同对象之间的转换的需求。通常做法无非为两种。
- 使用工具类转换:例如BeanUtils,但是底层是基于发射的,性能较差。
- 使用Get、Set转换:属性多的话,操作比较麻烦,重复,臃肿。
MapStruct介于两者之间,去掉了臃肿的代码,也避免了反射代来的性能。
Maven依赖
<properties>
<org.mapstruct.version>1.5.2.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
测试代码
测试类:DemoPo、DemoDto、DemoVo、TestMain
package com.lg.mgt.model;
public class DemoPo {
/**
* 省略Get、Set、构造函数
*/
private Integer id;
private String name;
private Integer age;
}
package com.lg.mgt.model;
public class DemoDto {
/**
* 省略Get、Set、构造函数
*/
private Integer id;
private String name;
private Integer age;
}
package com.lg.mgt.model;
public class DemoVo {
/**
* 省略Get、Set、构造函数
*/
private Integer demoId;
private String demoName;
private String testAge;
}
package com.lg.mgt.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import com.lg.mgt.model.DemoDto;
import com.lg.mgt.model.DemoPo;
import com.lg.mgt.model.DemoVo;
@Mapper
public interface DemoMapper {
/**
* 声明一个实例
*/
DemoMapper INSTANCE = Mappers.getMapper(DemoMapper.class);
/**
* Po转换Dto
*
* @see 默认按属性名进行注入,属性一样的两个类不用进行Mapping映射
* @param po
* @return
*/
DemoDto convertDto(DemoPo po);
/**
* Po转换Vo
*
* @see 属性名不一样的两个类需要进行Mapping映射
* @param po
* @return
*/
@Mappings({ @Mapping(source = "id", target = "demoId"), @Mapping(source = "name", target = "demoName"),
@Mapping(source = "age", target = "testAge"), })
DemoVo convertVo(DemoPo po);
}
系统运行之前需要先进行Maven打包:
mvn clean install
package com.lg.mgt.test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.lg.mgt.mapper.DemoMapper;
import com.lg.mgt.model.DemoDto;
import com.lg.mgt.model.DemoPo;
import com.lg.mgt.model.DemoVo;
public class Test {
public static void main(String[] args) {
/**
* 运行之前需要先进行maven打包
*/
/**
* po-->dto
*/
DemoPo po = new DemoPo(1, "lg", 27);
DemoDto dto = DemoMapper.INSTANCE.convertDto(po);
System.out.println(dto.getName() + "-" + dto.getAge() + "->" + dto.getId());
// 输出:lg-27->1
/**
* po-->vo
*/
DemoVo vo = DemoMapper.INSTANCE.convertVo(po);
System.out.println(vo.getDemoName() + "-" + vo.getTestAge() + "->" + vo.getDemoId());
/**
* list转换示范(基于Lambda)
*/
List<DemoPo> poList = new ArrayList<>();
List<DemoVo> voList = poList.stream().map(DemoMapper.INSTANCE::convertVo).collect(Collectors.toList());
}
}
完成。