翼度科技»论坛 编程开发 python 查看内容

MapStruct的一些常规用法

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
每天坚持写一篇原创文章。
使用过MapStruct之后,再也没用过BeanCopy来复制对象了。确实是非常好用的工具库。

MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。
大家的命名都不一样,我个人是习惯把数据库的DO对象叫Entity实体。
返回前端的叫VO。
把Entity复制到VO并做一些操作或者转换,再返回前端,都会用到。
安装

1、引用
唯一需要注意的就是如果配合Lombok,需要在编译源码的插件上做好配置。
  1. <properties>
  2.         <mapstruct.version>1.3.0.Final</mapstruct.version>
  3. </properties>
  4. <dependencies>
  5.     <dependency>
  6.         <groupId>org.mapstruct</groupId>
  7.         <artifactId>mapstruct</artifactId>
  8.         <version>${mapstruct.version}</version>
  9.     </dependency>
  10. </dependencies>
  11. <build>
  12.     <plugins>
  13.         <plugin>
  14.             <groupId>org.apache.maven.plugins</groupId>
  15.             <artifactId>maven-compiler-plugin</artifactId>
  16.             <version>${maven.compiler-plugin.version}</version>
  17.             <configuration>
  18.                 <source>${java.version}</source>
  19.                 <target>${java.version}</target>
  20.                 <compilerVersion>${java.version}</compilerVersion>
  21.                 <fork>true</fork>
  22.                 <encoding>${project.build.sourceEncoding}</encoding>
  23.                 <verbose>true</verbose>
  24.                 <annotationProcessorPaths>
  25.                     
  26.                     <path>
  27.                         <groupId>org.projectlombok</groupId>
  28.                         <artifactId>lombok</artifactId>
  29.                         <version>${lombok.version}</version>
  30.                     </path>
  31.                     
  32.                     <path>
  33.                         <groupId>org.mapstruct</groupId>
  34.                         <artifactId>mapstruct-processor</artifactId>
  35.                         <version>${mapstruct.version}</version>
  36.                     </path>
  37.                 </annotationProcessorPaths>
  38.             </configuration>
  39.         </plugin>
  40.     </plugins>
  41. </build>
复制代码
2、定义转换接口
  1. @Mapper
  2. public interface OrderConvertor {
  3.     OrderConvertor INSTANCE = Mappers.getMapper(OrderConvertor.class);
  4.     @Mapping(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss") // 指定时间格式
  5.     @Mapping(target = "name", source = "student.name", defaultValue = "张三") //默认值
  6.     OrderVo toVo(OrderEntity order);
  7. }
复制代码
target表示目标属性名,source表示源属性名,一般在目标属性和源属性不同时使用,相同的属性名会自动进行映射。
MapStruct会自动生成对应接口的实现,并自动完成属性映射关系,List会自动进行批量处理。
3、使用时
  1. @Service
  2. public class OrderService {
  3.     public List<OrderVo> getOrderList() {
  4.         // 获取数据库数据
  5.         List<OrderEntity> result = selectOrderList();
  6.         // 参数转换
  7.         return OrderConvertor.INSTANCE.toVo(result);
  8.     }
  9. }
复制代码
下面是我常用的一些功能记录

1、添加为Spring的Component组件
  1. @Mapper(componentModel = "spring")
复制代码
2、List转换为String
类注解加上引用
  1. @Mapper(imports = {Collectors.class, TelegramGroupEntity.class})
复制代码
代码里面:使用表达式,转换为字符串
  1. @Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining(", ")) : null)")
  2. AcceptanceBankVo convert(AcceptanceBankEntity source);
复制代码
直接转换List为换行的String
  1. @Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining("\\n")) : null)")
复制代码
直接调用方法
  1. @Mapper(imports = {Collectors.class, TelegramGroupEntity.class, IndiaDateUtil.class})
  2. public interface TransferBankConvert {
  3. TransferBankConvert INSTANCE = Mappers.getMapper(TransferBankConvert.class);
  4. @Mapping(target = "timeAgo", expression = "java(source.getLastActiveTime()!= null? IndiaDateUtil.getTimeAgo(source.getLastActiveTime(),"Asia/Kolkata") : null)")
  5. TransferBankVo convert(TransferBankEntity source);
  6. }
复制代码
3、获取时间
  1. @Mapping(target = "recordTime",expression = "java(new java.util.Date())")
复制代码
4、空检查
  1. @Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
复制代码
5、枚举映射String和string到枚举
int转枚举的value
  1. @Mapper(imports = {AccptanceRoleTypeEnum.class}) // 加到类上引用进来
  2. @Mapping(target = "roleText", expression = "java(AccptanceRoleTypeEnum.getItemValue(source.getRole()))")
复制代码
枚举上加上:
  1. /**
  2. * 根据Value取描述
  3. * @param value
  4. * @return
  5. */
  6. public static String getItemValue(Integer value) {
  7.     AccptanceRoleTypeEnum match = Stream.of(values()).filter(item -> item.value.equals(value)).findAny().orElse(null);
  8.     return match == null ? null : match.getDesc();
  9. }
复制代码
6、Fill同对象填充新对象,把source填充到target里面,和以前的beancopy一样的。
  1. @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
  2.         nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
  3. @Mappings({
  4.         @Mapping(target = "id", ignore = true),
  5.         @Mapping(target = "createTime", ignore = true),
  6.         @Mapping(target = "updateTime", ignore = true)
  7. })
  8. void fill(TelegramGroupRoleEntity source, @MappingTarget TelegramGroupRoleEntity target);
复制代码
要忽略空值填充
  1. @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
  2. void update(DTO dto, @MappingTarget Bean bean);
复制代码
7、Map提取,还是用表达式最简单
  1. @Mappings({
  2.         @Mapping(expression = "java(mapConfig.getOrDefault("INPAY_RATES",""))", target = "inpayRates"),
  3.         @Mapping(expression = "java(mapConfig.getOrDefault("AUTO_CREDIT",""))", target = "autoCredit")
  4. })
  5. TelegramGroupWithConfigVo convert(TelegramGroupEntity entity);
复制代码
8、空值判断
  1. @Mapping(target = "targetField", expression = "java( sourceField == null || sourceField.isEmpty() ? null : sourceField )") 来将空字符串映射为 null
复制代码
更多内容请关注我的公众号:青塬科技。

来源:https://www.cnblogs.com/kylexy/p/18055007
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具