简介

mapstrct是一个很好注释处理的框架,解决繁琐domain之间值的转换,节约开发的时间,同时相对应copyProperty的好处是没有使用反射技术,使性能更优。mapstrut一共两个主要的包,org.mapstruct.mapstruct包含里面常用的注释,org.mapstruct.mapstruct-processor处理注释的实现。

官方文档

文档传送门

maven引入

<!-- 指定版本 -->
<properties><org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
</properties><!-- 引入依赖 -->
<dependencies><!--mapstruct主键--><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><!-- mapstruct插件 可以直接点击查看mapstruct的实现类 --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-jdk8</artifactId><version>${org.mapstruct.version}</version><dependency><!-- mapstruct实现类执行器 --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version><scope>private</scope></dependency>
</dependencies>

基本使用

  1. 定义一个接口,使用 @Mapper
  2. 定义一个转换的方法。方法上常用的注解
@Mapping(target="",source="")、
@Mappings({@Mapping(target="",source=""),@Mapping(target="",source="")})

ps:如果target和source字段名相同则无需使用注解,mapstruct会自动为我们copy值的
3. @BeanMapping(ignoreByDefault=true)忽略自动注解功能
4. 例子

@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Item {Long itemId;String title;
}@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Sku {Long skuId;String code;Integer price;
}@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class SkuDTO {Long skuId;String skuCode;Integer skuPrice;Long itemId;String itemName;
}@Mapper
public interface ItemConvert {ItemConvert INSTANCE = Mappers.getMapper(ItemConvert.class);@BeanMapping(ignoreByDefault = true)@Mappings({@Mapping(source = "sku.code", target = "skuCode"),@Mapping(source = "sku.price", target = "skuPrice"),@Mapping(source = "item.title", target = "itemName")})SkuDTO domain2Dto(Sku sku, Item item);
}
  • mapstruct自动实现
@Generated(value = "org.mapstruct.ap.MappingProcessor",date = "2019-07-30T18:14:08+0800",comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_101 (Oracle Corporation)"
)
public class ItemConvertImpl implements ItemConvert {@Overridepublic SkuDTO domain2Dto(Sku sku, Item item) {if ( sku == null && item == null ) {return null;}SkuDTO skuDTO = new SkuDTO();if ( sku != null ) {skuDTO.setSkuPrice( sku.getPrice() );skuDTO.setSkuCode( sku.getCode() );}if ( item != null ) {skuDTO.setItemName( item.getTitle() );}return skuDTO;}
}
  • 特别说明,因为使用了@BeanMapping,所有只有我们需要转换的才会转换,但是如果去掉BeanMapping,那么他的实现就是这样的
@Generated(value = "org.mapstruct.ap.MappingProcessor",date = "2019-07-30T18:17:19+0800",comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_101 (Oracle Corporation)"
)
public class ItemConvertImpl implements ItemConvert {@Overridepublic SkuDTO domain2Dto(Sku sku, Item item) {if ( sku == null && item == null ) {return null;}SkuDTO skuDTO = new SkuDTO();if ( sku != null ) {skuDTO.setSkuPrice( sku.getPrice() );skuDTO.setSkuCode( sku.getCode() );skuDTO.setSkuId( sku.getSkuId() );}if ( item != null ) {skuDTO.setItemName( item.getTitle() );skuDTO.setItemId( item.getItemId() );}return skuDTO;}
}

多个入参

mapstruct支持多个参数的,如果名字一样则会自动映射,不同则需要使用@Mapping,如果多个参数的都有target的属性名需要制定是哪个source的属性名,否则会报错

  • 多个POJO作为入参
@Mapper
public interface CarAssertApiMapper {CarAssertApiMapper INSTANCE = Mappers.getMapper(CarAssertApiMapper.class);/*** 两个do转成一个dto** @param purchaseBillItemDO 采购明细单* @param carManageDO        车型* @return 目的dto*/@Mappings({@Mapping(target = "modelCode", source = "carManageDO.modelCode"),@Mapping(target = "modelName", source = "carManageDO.modelName"),@Mapping(target = "modelColor", source = "carManageDO.modelColor"),@Mapping(target = "modelColorCode", source = "carManageDO.modelColorCode"),@Mapping(target = "interiorColor", source = "carManageDO.interiorColor"),@Mapping(target = "interiorColorCode", source = "carManageDO.interiorColorCode"),@Mapping(target = "purchaseBillItemId", source = "purchaseBillItemDO.billItemId")})PurchaseCreateDTO doToDto(PurchaseBillItemDO purchaseBillItemDO, CarManageDO carManageDO);
}

车型信息,purchaseBillItemDO和carManageDO都有这个字段,所以需要具体制定到是哪个实体类的字段,否则mapstruct不知道是用哪个

  • 基本类型或者常见的java类型作为入参

mapstruct可以直接将一个基本类型的字段直接映射对应的bean字段

@Mapper
public interface CarMapper {CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);/*** 多个参数转换为targetDTO** @param carDO       source car DO* @param warehouseDO source warehouse DO* @param userName    操作人 这个会直接映射到目标bean的相同字段属性上,*                    若是属性名不一致,则需要使用@Mapping* @return target DTO* ps:多个mapping可能使用Mappings更方便* @Mappings({* @Mapping(source = "warehouseDO.plate_cities", target = "plateCities")* })*/@Mapping(source = "warehouseDO.plate_cities", target = "plateCities")CarDTO severalSourceToDTo(CarDO carDO, WarehouseDO warehouseDO, String userName);
}

更新POJO

mapstruct不仅仅可以create instance, 也可以更新instance,使用@MappingTarget

@Mapper
public interface CarMapper {CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);/*** 更新DTO里的值** @param carDTO      target update instance* @param inventoryDO source do*/void updateCarDTO(@MappingTarget CarDTO carDTO, InventoryDO inventoryDO);
}

mapStruct 之 基本使用相关推荐

  1. 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:阿进的写字台 https://www.cnblogs ...

  2. 丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 在前几天的文章<为什么阿里巴巴禁止使用Apache Bean ...

  3. 业务代码的救星——Java对象转换框架MapStruct

    介绍 在业务项目的开发中,我们经常需要将Java对象进行转换,比如从外部HSF服务得到的对象转换为本域的业务对象domain object,将domain object转为数据持久层的data obj ...

  4. 推荐一个 Java 实体映射工具 MapStruct

    声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...

  5. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用

    简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...

  6. 【迁移2018-04-12 10:46:11】BeanCopier之MapStruct(一)

    为什么80%的码农都做不了架构师?>>>    无意中见同事在比较BeanCopier的效率,MapStruct的使用者很牛皮的说我的效率是你的XX倍,今天认识了一下MapStrut ...

  7. MapStruct在Eclipse中的使用

    在Eclipse中使用MapStruct时,会报找不到实现类.需要添加m2e-apt插件 同时在preferences->maven中设置Automatically configure JDT ...

  8. 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 介绍 在工作中,我们经常要进 ...

  9. 如何解决mapstruct和lombok冲突问题

    一.冲突如何产生 在按照官网配置mapstruct,使用lombok.当我们在maven install时候会出现属性找不到错误. 二.解决配置如下 确保 Lombok 最低版本为 1.18.16 a ...

  10. mapstruct 1.4.2 和 lombok 1.18.16 及以上版本结合使用

    在使用 mapstruct 时发现其不生效,检查生成的转换器实现类,发现全部没有调用 setter 方法进行对象数据转移. 后来考虑到类 setter 方法是使用 lombok 插件生成的,所以应该控 ...

最新文章

  1. Linux中Sleep和Wait命令的使用方式
  2. 重启服务才可连接BOOT服务器
  3. MFC中滑动条的使用
  4. 笔记11:GDI 制作数字验证码
  5. pytorch初入门学习记录
  6. 北京Uber优步司机奖励政策(4月7日)
  7. 用决策树模型求解回归问题(regression tree)
  8. 如何查看自己windows电脑的IP地址
  9. 一点处的导数无法确定单调性
  10. 企业从无到有,云账户CEO大谈创业时代的创业者思维
  11. 回眸 2022,展望 2023
  12. 甘超波:NLP价值观
  13. ssh登录ubuntu
  14. Git如何删除自己创建的项目
  15. 鸿蒙3部曲先看哪部,“斗罗”有四作,那当年齐名的“鸿蒙”系列到底有“几部曲”?...
  16. 牛逼!最强拆迁户!上市公司喜提近26亿拆迁款,为去年净利78倍!3万股东沸腾了...
  17. docker导入MySQL数据库
  18. 理财领域各种“潜规则”
  19. 2017年爱奇艺校招模拟笔试编程
  20. Android WebView 资源探查

热门文章

  1. *python解决狼羊菜过河问题
  2. appreciate
  3. Github 如何删除自己的仓库
  4. 想做就马上做,喜欢就坚持做 —— 我的编程之路
  5. Expert C Programming 阅读笔记(~CH1)
  6. Windows Server 2012 RemoteApp体验-多服务器部署(1)
  7. 机器学习中半监督学习是什么?人工智能机器学习
  8. Android 使用网络技术
  9. iOS ssh服务终端命令操控手机
  10. 阿里 P8 高级架构师年入百万,到底什么水平?