需求背景:有一个业务对象,数据库里存的是分号隔开的String,在返回给前台时需要转换成List

dao类TNotice中

@ApiModelProperty(value = "附件地址,以分号隔开")
private String attachments;

vo类NoticeVo中

@ApiModelProperty(value = "附件地址列表")
private List attachmentList;

mapStruct类中的写法

@Mapper(componentModel = "spring")
public interface NoticeExchange {
  @Mappings({
          @Mapping(source = "attachments", target = "attachmentList"),
          @Mapping(source = "types", target = "typeList")
  })
  NoticeVo dao2Vo(TNotice dao);

  @Mappings({
          @Mapping(source = "attachmentList", target = "attachments"),
          @Mapping(source = "typeList", target = "types")
  })
  TNotice vo2dao(NoticeVo vo);

  // str转list
  default List<String> str2List(String src){
      String[] split = src.split(";");
      List<String> result = Arrays.asList(split);
      return result;
  }

  // list转str
  default String list2Str(List<String> src){
      if (CollUtil.isEmpty(src)) {
          return "";
      }
      StringBuffer sb = new StringBuffer();
      src.stream().forEach(item -> sb.append(item).append(";"));
      return sb.toString();
  }
}

当需要String转List时,MapStruct会自动调用str2List。当需要list转string时,会自动调用list2Str

50c3a200a40d64a247fdec968a0c539f.png

MapStruct 入门篇中的内容

对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感, 却又不得不存在。我后来想的一个办法就是通过反射, 或者自己写很多的转换器。

第一种通过反射的方法确实比较方便, 但是现在无论是 BeanUtils, BeanCopier 等在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话, 需要类型和名称都一样才会进行映射, 有很多时候, 由于不同的团队之间使用的名词不一样, 还是需要很多的手动 set/get 等功能。

第二种的话就是会很浪费时间, 而且在添加新的字段的时候也要进行方法的修改。不过, 由于不需要进行反射, 其性能是很高的。

MapStruct 带来的改变

MapSturct 是一个生成 类型安全, 高性能且无依赖的 JavaBean 映射代码的注解处理器(annotation processor)。

抓一下重点:

  1. 注解处理器

  2. 可以生成 JavaBean 之间那的映射代码

  3. 类型安全, 高性能, 无依赖性

从字面的理解, 我们可以知道, 该工具可以帮我们实现 JavaBean 之间的转换, 通过注解的方式。

同时, 作为一个工具类,相比于手写, 其应该具有便捷, 不容易出错的特点。


版权声明:本文为weixin_30523059原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_30523059/article/details/112714538