需求背景:有一个业务对象,数据库里存的是分号隔开的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
MapStruct 入门篇中的内容
对于代码中 JavaBean
之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean
之间的相互转化, 非常的影响观感, 却又不得不存在。我后来想的一个办法就是通过反射, 或者自己写很多的转换器。
第一种通过反射的方法确实比较方便, 但是现在无论是 BeanUtils
, BeanCopier
等在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话, 需要类型和名称都一样才会进行映射, 有很多时候, 由于不同的团队之间使用的名词不一样, 还是需要很多的手动 set/get 等功能。
第二种的话就是会很浪费时间, 而且在添加新的字段的时候也要进行方法的修改。不过, 由于不需要进行反射, 其性能是很高的。
MapStruct 带来的改变
MapSturct
是一个生成 类型安全, 高性能且无依赖的 JavaBean 映射代码的注解处理器(annotation processor)。
抓一下重点:
-
注解处理器
-
可以生成
JavaBean
之间那的映射代码 -
类型安全, 高性能, 无依赖性
从字面的理解, 我们可以知道, 该工具可以帮我们实现 JavaBean
之间的转换, 通过注解的方式。
同时, 作为一个工具类,相比于手写, 其应该具有便捷, 不容易出错的特点。
版权声明:本文为weixin_30523059原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。