前言
1.VO(View Object),视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来,主要用来显示。
2.DTO(Data Transfer Object),数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
3.DO(Domain Object),领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
4.PO(PersistentObject),持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
我们可以用MapStruct映射工具来进行转换
1.简单使用
学习一个新的框架较好的方式是先把demo跑起来,然后一步步的熟悉框架的用法。接下来让我们跑一个简单的demo,简单熟悉MapStruct的使用
通常在项目中,mapStruct和lombox会同时使用,具体的maven配置如下。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.12</version>
</dependency>
</dependencies>
<!-- 配置lombok 和mapStruct注解处理器 -->
<build>
<pluginManagement>
<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>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
官方maven配置:
############mapper Struct###########
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.mapstruct.examples.lombok</groupId>
<artifactId>mapstruct-examples-lombok</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- lombok dependencies should not end up on classpath -->
<!-- 如果 MapStruct 生成的实现类里面,只创建了对象没有对属性进行 set 可能是版本没匹配,使用官方给的这个版本就好了 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- IntelliJ pre 2018.1.1 requires the mapstruct processor to be present as provided dependency -->
<!-- 高版本的 IDEA 就不需要添加这个依赖了 -->
<!--
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>
-->
</dependencies>
<build>
<pluginManagement>
<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>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
?2.举例
java代码如下:
定义Person实体
@Data
public class Person {
private String name;
private String lastName;
}
定义PersonDTO
@Data
public class PersonDTO {
private String firstName;
private String lastName;
}
使用MapStruct定义Person和PersonDTO之间的转换接口
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "firstName",target = "name")
Person personDTOToPerson(PersonDTO personDTO);
}
使用上面定义的转换器,例子如下
public class PersonMapperTest {
@Test
public void personDTOToPerson() {
PersonMapper personMapper = PersonMapper.INSTANCE;
PersonDTO personDTO = new PersonDTO();
personDTO.setFirstName("feng");
personDTO.setLastName("xiu");
Person person = personMapper.personDTOToPerson(personDTO);
Assert.assertEquals(person.getLastName(),personDTO.getLastName());
Assert.assertEquals(person.getName(),personDTO.getFirstName());
}
}
从上面的例子可以看出,使用MapStruct定义一个对象转换器,分为以下几步
- 创建一个对象转换接口,使用@Mapper注解
- 定义转换方法,设置需要转换的对象作为参数,返回值是转换后的对象
- 使用@Mapping注解方法,设置转换对应的属性,如果属性名相同,则不需要设置。
- 接口中定义一个属性,使用Mappers.getMapper方获取对应的实现,方便使用。
通过上面4步,就可以定义出一个对象转换器,相比于之前来说简单很多。
?详细讲解
|