Java中MapStruct的使用详解
作者:韩_师兄
这篇文章主要介绍了Java中MapStruct的使用详解,mapstruct,全称是org.mapstruct.Mapper, 是将接口或抽象类标记为映射器,并通过MapStruct为这个接口或者抽象类生成一个实现类,大大简化了Java bean类型之间转换,需要的朋友可以参考下
mapstruct概述
mapstruct,全称是org.mapstruct.Mapper, 是将接口或抽象类标记为映射器,并通过MapStruct为这个接口或者抽象类生成一个实现类,大大简化了Java bean类型之间转换
在维护一个新项目时,突然发现了,项目中一个新奇的点,就说关于MapStruct的使用,因为关于值传递映射,从最初的手动映射,到后来的工具类. 对于MapStruct使用较少,故整理记录一下该使用说明
优点:
- mapstruct是在编译时完成Bean转换,
- 和传统相比,提升了服务性能
- 编译后在target目录,生成对应的xxximp.java文件,方便定位问题
缺点:
- 必须添加一个接口或者抽象类,才能实现映射
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; } } }
mapstruct总结
通过mapstruct的使用发现,和之前工具类的映射有很多不同.
不过其工作定位在,实体对象,Dto,Bo等对象在不通层级的转换,可以通过默认值,常量值,java代码和函数,比较灵活多变.
到此这篇关于Java中MapStruct的使用详解的文章就介绍到这了,更多相关MapStruct的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!