实体映射工具-MapStruct使用详解



当项目膨胀到一定程度,为了提高维护性和扩展性,遵从单一原则、开闭原则,必然会建立很多的实体类来划分边界。如果项目不幸上了DDD,那一连串DO、entity、DTO、VO的数量更是怀疑人生的程度。
这是实体类之间的转换,就不能再靠手写 setter & getter了。
MapStruct就是这么一个代码生成器,来简化不同 Java Bean之间映射的处理。其实 SpringApache也提供了BeatUtils工具,但确实功能不能 MapStruct强大。
另外, BeanUtils使用的反射机制,性能较差,而 MapStruct则通过在代码编译阶段,自动添加赋值方法,非常优雅高效得解决了问题。

参考内容:

  1. 官网
  2. github
  3. 文档

一、引入依赖

<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

准备几个实体类

  1. User
public class User {
	private Long id;
	private String firstName;
	private String secondName;
	// getter & setter
}
  1. UserDTO
public class UserDTO {
	private String userId;
	private String fullName;
	private String position;
	// getter & setter
}
  1. UserEO
public class UserEO {
	private Long id;
	private String firstName;
	private String secondName;
	// getter & setter
}
  1. Role
public class Role {
	private Long id;
	private String description;
	// getter & setter
}

定义一个映射器

如果你的两个类中的字段名称是一致的,只需要写方法签名即可,不需要写@Mapping注解。
如果参数名称有变化,需要使用@Mappingsource为原参数的名称,target为新参数的名称

// 1. 添加注解
@Mapper
// 2. 新增转换接口
public interface UserMap {
    // 3. 新增转换方法
    User userEO2Entity(UserEO userEO);
}

有多个源参数的情况

比如在UserDTO中,userId来自User中的idposition来自Role中的id

@Mapping(source=user.id, target=userId)
@Mapping(source=role.id, target=position)
UserDTO entity2DTO(User user, Role role);

自定义转换方法

还可以通过指定方法,实现自定义映射,如User中的idLong型,映射到UserDTO中的userIdString型。

// qualifiedByName的值对应自定义方法的名称
@Mapping(source=id, target,userId, qualifiedByName = "convertId")
UserDTO entity2DTO(User user);

// 新建缺省方法
default String convertId(Long id) {
	return String.valueOf(id);
}

… 待更新

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值