介绍
在项目中经常会用到DO,BO,DTO,VO等对象的相互转化,这就需要一个高效通用的转化工具,毕竟每个字段get/set方法会很麻烦。MapStruct 就是这样的一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct就会自动实现这个映射接口,避免了复杂繁琐的映射实现。
2.代码工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.">
<parent>
<artifactId>springboot-demo</artifactId>
<groupId></groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mapstruct</artifactId>
<properties>
<>8</>
<>8</>
</properties>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
配置文件
server:
port: 8088
启动类
package ;
import ;
import ;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
(, args);
}
}
entity
package ;
import ;
@Data
public class Car {
private String make;
private int numberOfSeats;
private CarType carType;
}
package ;
import ;
@Data
public class CarDTO {
private String make;
private int seatCount;
private String type;
}
package ;
import ;
@Data
public class CarType {
private String type;
}
mapper
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@Mapper(componentModel = "spring",imports = {, , })//交给spring管理
public interface CarMapping {
/**
* 用来调用实例 实际开发中可使用注入Spring 不写
*/
CarMapping CAR_MAPPING = ();
/**
* 源类型 目标类型 成员变量相同类型 相同变量名 不用写{@link }来映射
*
* @param car the car
* @return the car dto
*/
@Mapping(target = "type", source = "")
@Mapping(target = "seatCount", source = "numberOfSeats")
CarDTO carToCarDTO(Car car);
}
上面短短几行代码就可以了十分简单!解释一下操作步骤: 首先声明一个映射接口用@
(不要跟mybatis注解混淆)标记,说明这是一个实体类型转换接口。这里我们声明了一个 CAR_MAPPING
来方便我们调用,CarDTO toCarDTO(Car car)
是不是很熟悉, 像mybatis
一样抽象出我们的转换方法。@
注解用来声明成员属性的映射。该注解有两个重要的属性:
source
代表转换的源。这里就是Car
。target
代表转换的目标。这里是CarDTO
。
这里以成员变量的参数名为依据,如果有嵌套比如 Car
里面有个 CarType
类型的成员变量 carType
,其 type
属性 来映射 CarDTO
中的 type
字符串,我们使用 来获取属性值。如果有多层以此类推。
MapStruct
最终调用的是 setter
和 getter
方法,而非反射。这也是其性能比较好的原因之一。numberOfSeats
映射到 seatCount
就比较好理解了。我们是不是忘记了一个属性 make
,因为他们的位置且名称完全一致,所以可以省略。而且对于包装类是自动拆箱封箱操作的,并且是线程安全的。MapStruct不单单有这些功能,还有其他一些复杂的功能
代码仓库
/Harries/springboot-demo
3.测试
package ;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .;
@RunWith()
@SpringBootTest
public class CarMappingTest {
private Car car;
private CarDTO carDTO;
@Autowired
private CarMapping;
@Before
public void setUp() throws Exception {
car = new Car();
("make");
CarType type = new CarType();
("type");
(type);
(1);
}
@Test
public void testcarToCarDTO() {
carDTO = (car);
((carDTO));
}
}
输出结果
{"make":"make","seatCount":1,"type":"type"}
4.引用
/documentation/stable/reference/html/#defining-mapper
/archives/