![](https://i-blog.csdnimg.cn/blog_migrate/d00645fff726c9cb2c04248bcfbfb249.png)
当项目膨胀到一定程度,为了提高维护性和扩展性,遵从单一原则、开闭原则,必然会建立很多的实体类来划分边界。如果项目不幸上了DDD,那一连串DO、entity、DTO、VO的数量更是怀疑人生的程度。
这是实体类之间的转换,就不能再靠手写
setter
&
getter
了。
MapStruct就是这么一个代码生成器,来简化不同 Java Bean之间映射的处理。其实 Spring和 Apache也提供了BeatUtils工具,但确实功能不能 MapStruct强大。
另外, BeanUtils使用的反射机制,性能较差,而 MapStruct则通过在代码编译阶段,自动添加赋值方法,非常优雅高效得解决了问题。
参考内容:
一、引入依赖
<properties>
<mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
二、使用MapStruct
准备几个实体类
- User
public class User {
private Long id;
private String firstName;
private String secondName;
// getter & setter
}
- UserDTO
public class UserDTO {
private String userId;
private String fullName;
private String position;
// getter & setter
}
- UserEO
public class UserEO {
private Long id;
private String firstName;
private String secondName;
// getter & setter
}
- Role
public class Role {
private Long id;
private String description;
// getter & setter
}
定义一个映射器
如果你的两个类中的字段名称是一致的,只需要写方法签名即可,不需要写@Mapping
注解。
如果参数名称有变化,需要使用@Mapping
,source
为原参数的名称,target
为新参数的名称
// 1. 添加注解
@Mapper
// 2. 新增转换接口
public interface UserMap {
// 3. 新增转换方法
User userEO2Entity(UserEO userEO);
}
有多个源参数的情况
比如在UserDTO
中,userId
来自User
中的id
,position
来自Role
中的id
@Mapping(source=user.id, target=userId)
@Mapping(source=role.id, target=position)
UserDTO entity2DTO(User user, Role role);
自定义转换方法
还可以通过指定方法,实现自定义映射,如User
中的id
为Long型,映射到UserDTO
中的userId
String型。
// qualifiedByName的值对应自定义方法的名称
@Mapping(source=id, target,userId, qualifiedByName = "convertId")
UserDTO entity2DTO(User user);
// 新建缺省方法
default String convertId(Long id) {
return String.valueOf(id);
}
… 待更新