对象转换工具
开始之前
po:跟表明相同
Mapstruct
优点
- 通过使用普通方法调用(settter/getter)而不是反射来快速执行
- 编译时类型安全性:只能映射相互映射的对象和属性,不能将order实体意外映射到customer DTO等。
- 如果有如下问题,编译时会抛出异常
3.1 映射不完整(并非所有目标属性都被映射)
3.2 映射不正确(找不到正确的映射方法或类型转换)
Maven
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <!--mapStruct依赖 高性能对象映射--> <!--mapstruct核心--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.0.Beta1</version> </dependency> <!--mapstruct编译--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.0.Beta1</version> </dependency>
|
定义一个映射器
2.1基本映射
要创建映射器,只需使用所需的映射方法定义一个Java接口,并用注释对其进行org.mapstruct.Mapper注释:
该@Mapper注释将使得MapStruct代码生成器创建的执行PersonMapper 过程中生成时的界面。
在生成的方法实现中,源类型(例如Person)的所有可读属性都将被复制到目标类型(例如PersonDTO)的相应属性中:
- 当一个属性与其目标实体对应的名称相同时,它将被隐式映射。
- 当属性在目标实体中具有不同的名称时,可以通过@Mapping注释指定其名称。
==如果不指定@Mapping,默认映射name相同的field==
==如果映射的对象field name不一样,通过 @Mapping 指定。==
==忽略字段加@Mapping#ignore() = true==
2.2 指定默认值
@Mapping(target = “describe”, source = “describe”, defaultValue = “默认值”)
2.3 使用表达式
@Mapping(target = “createTime”,expression = “java(new java.util.Date())”)
如果属性从字符串映射到日期,则该格式字符串可由SimpleDateFormat处理,反之亦然。当映射枚举常量时,将忽略所有其他属性类型。
2.5 逆映射
在双向映射的情况下,例如从实体到DTO以及从DTO到实体,前向方法和反向方法的映射规则通常是相似的,并且可以通过切换source和来简单地反转target。
使用注释@InheritInverseConfiguration
表示方法应继承相应反向方法的反向配置
1 2 3 4 5
| @Mapping(target = "age",source = "age", numberFormat = "#0.00") PersonDTO conver(Person person);
@InheritInverseConfiguration Person conver(PersonDTO dto);
|
2.6 集成到 spring
@Mapper(componentModel = “spring”)
2.7实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Mapper(componentModel = "spring")
public interface BoyGirlConverter {
@Mappings( //忽视该属性 @Mapping(target = "girlFriends",ignore = true) ) CoolBoyDto po2Dto(CoolBoy coolBoy);
@Mappings( @Mapping(target = "girlType",expression = "java(girlType(coolGirl.getGirlType()))") ) CoolGirlDto po2Dto(CoolGirl coolGirl);
List<CoolBoy> po2DtoBoys(List<CoolBoy> coolBoyList);
@Mapping(source = "salary",target = "salary") CoolBoyVo boyDto2Vo(CoolBoyDto coolBoyDto);
@InheritConfiguration(name = "boyDto2Vo") CoolBoyDto vo2Dto(CoolBoyDto CoolBoyVo);
default String girlType(Integer girlTypeCode){ return GirlTypeEnums.byCode(girlTypeCode).getLabel(); } }
|
写这样一个mapper就可以进行对象自动转换。
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~