关于MapStruct的使用
在维护一个新项目时,突然发现了,项目中一个新奇的点,就说关于MapStruct的使用,因为关于值传递映射,从最初的手动映射,到后来的工具类. 对于MapStruct使用较少,故整理记录一下该使用说明.
1 mapstruct概述
mapstruct,全称是org.mapstruct.Mapper, 是将接口或抽象类标记为映射器,并通过MapStruct为这个接口或者抽象类生成一个实现类,大大简化了Java bean类型之间转换.
优点:
mapstruct是在编译时完成Bean转换,
1 和传统相比,提升了服务性能
2 编译后在target目录,生成对应的xxximp.java文件,方便定位问题
缺点:
1 必须添加一个接口或者抽象类,才能实现映射
2 mapstruct案例
依赖在spring环境中使用,通过编译打包发现,会生成对应接口的实现类.
1 添加依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
2 添加实体对象和DTO
实体对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String id;
private String name;
private Date crateTime;
}
Dto对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private String userId;
private String userName;
private Date beginTime;
}
3 添加接口
/**
* componentModel 制定模式spring 将bean交给spring管理
* unmappedTargetPolicy ignore 目标属性未匹配时系统忽略,不打印警告日志
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE )
public interface UserMapper {
//静态成员
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
// 单个书写
// 常量
@Mapping(source = "id", target = "userId",constant = "可以指定常量")
// 默认值
@Mapping(source = "name", target = "userName", defaultValue = "可以指定默认值")
// 日期转换
@Mapping(source = "crateTime", target = "beginTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
UserDto userToUserDto(User user);
// 批量写法 与上述二选一
@Mappings({
// Integer 到 String的转换
@Mapping(source = "id", target = "numId" ,numberFormat = "$#.00"),
@Mapping(source = "name", target = "userName"),
//Date 转字符串
@Mapping(source = "crateTime", target = "crtTime", dateFormat = "dd.MM.yyyy"),
// 使用java可执行代码或函数
@Mapping(target = "crateTime", expression = "java(java.time.LocalDateTime.now()")
})
UserDto userToUserDto2(User user);
// 批量转换,循环调用上面单个转换
List<UserDto> userToUserDtoList(List<User> users);
}
4 通过Maven命令,编译打包项目,发现target对应包下面,生成了一个UserMapperImpl.class文件.
@Component
public class UserMapperImpl implements UserMapper {
public UserMapperImpl() {
}
@Override
public UserDto userToUserDto(User user) {
if (user == null){
return null;
}else{
UserDto userDto = new UserDto();
user.setId(user.getId());
user.setName(user.getName());
user.setCrateTime(user.getCrateTime());
return userDto;
}
}
@Override
public List<UserDto> userToUserDtoList(List<User> users) {
if (users == null){
return null;
}else{
List<UserDto> list = new ArrayList<>(users.size());
Iterator var3 = users.iterator();
while (var3.hasNext()){
User user = (User) var3.next();
list.add(this.userToUserDto(user));
}
return list;
}
}
}
3 mapstruct总结
通过mapstruct的使用发现,和之前工具类的映射有很多不同.
不过其工作定位在,实体对象,Dto,Bo等对象在不通层级的转换,可以通过默认值,常量值,java代码和函数,比较灵活多变.