MapStruct 常用操作

文章目录

          • 一、快速入门
            • 1. 简介
            • 2. 引入依赖
          • 二、entity赋值vo
            • 2.1. Product
            • 2.2. ProductVO
            • 2.3. mapper定义
            • 2.4. 测试验证
          • 三、集合属性赋值
            • 3.1. mapper定义
            • 3.2. 测试
          • 四、2个对象整合属性赋值
            • 4.1. mapper定义
            • 4.2. 测试
          • 五、自定义类型转换
            • 5.1. mapper定义
            • 5.2. 测试

一、快速入门
1. 简介

MapStruct是满足JSR269规范的一个Java注解处理器,用于为Java Bean生成类型安全且高性能的映射。它基于编译阶段生成get/set代码,此实现过程中没有反射,不会造成额外的性能损失。

您所要做的就是定义一个mapper接口(@Mapper),该接口用于声明所有必须的映射方法。在编译期间MapStruct会为该接口自动生成实现类。该实现类使用简单的Java方法调用来映射source-target对象,在此过程中没有反射或类似的行为发生。

2. 引入依赖
  <properties><java.version>1.8</java.version><mapstruct.version>1.4.1.Final</mapstruct.version></properties><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${mapstruct.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>8</source><target>8</target><encoding>UTF-8</encoding><annotationProcessorPaths><!-- 必须要加, 否则生成不了 MapperImpl 实现类 --><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${mapstruct.version}</version></path><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></path><!-- 如果是 0.1.0 有可能出现生成了maptruct的实现类, 但该类只创建了对象, 没有进行赋值 --><path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version></path></annotationProcessorPaths></configuration></plugin></plugins></build>
二、entity赋值vo
2.1. Product
@Data
@AllArgsConstructor
public class Product {private Integer productId;private String productName;private BigDecimal productPrice;private Integer productStatus;
}
2.2. ProductVO
@Data
public class ProductVO {private Integer id;private String name;private BigDecimal price;private Boolean status;
}
2.3. mapper定义
@Mapper
public interface ProductMapper {/*** 获取该类自动生成的实现类的实例* 接口中的属性都是 public static final 的 方法都是public abstract的*/ProductMapper mapper = Mappers.getMapper(ProductMapper.class);/*** 这个方法就是用于实现对象属性复制的方法** @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性** @param user 这个参数就是源对象,也就是需要被复制的对象* @return 返回的是目标对象,就是最终的结果对象*/@Mappings({@Mapping(source = "productId",target = "id"),@Mapping(source = "productName",target = "name"),@Mapping(source = "productPrice",target = "price")})ProductVO pojo2vo(Product product);}
2.4. 测试验证

属性不一致赋值

	@Testpublic void test() {Product product = new Product(1,"电脑", new BigDecimal(6000),1);ProductVO productVO = ProductMapper.mapper.pojo2vo(product);System.out.println(productVO);}
三、集合属性赋值
3.1. mapper定义
@Mapper
public interface ProductMapper {/*** 获取该类自动生成的实现类的实例* 接口中的属性都是 public static final 的 方法都是public abstract的*/ProductMapper mapper = Mappers.getMapper(ProductMapper.class);/*** 这个方法就是用于实现对象属性复制的方法** @param product 这个参数就是源对象,也就是需要被复制的对象* @return 返回的是目标对象,就是最终的结果对象* @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性*/@Mappings({@Mapping(source = "productId",target = "id"),@Mapping(source = "productName",target = "name"),@Mapping(source = "productPrice",target = "price")})ProductVO pojo2vo(Product product);List<ProductVO> list2vo(List<Product> list);}
3.2. 测试
    @Testpublic void list(){List<Product> list = new ArrayList<>();for (int i = 0; i < 3; i++) {list.add(new Product(i,"电脑"+i,new BigDecimal(6000),1));}List<ProductVO> productVOS = ProductMapper.mapper.list2vo(list);for (ProductVO productVO : productVOS) {System.out.println(productVO);}}
四、2个对象整合属性赋值
4.1. mapper定义
@Mapper
public interface ProductMapper {/*** 获取该类自动生成的实现类的实例* 接口中的属性都是 public static final 的 方法都是public abstract的*/ProductMapper mapper = Mappers.getMapper(ProductMapper.class);/*** 这个方法就是用于实现对象属性复制的方法** @param product 这个参数就是源对象,也就是需要被复制的对象* @return 返回的是目标对象,就是最终的结果对象* @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性*/@Mappings({@Mapping(source = "productId",target = "id"),@Mapping(source = "productName",target = "name"),@Mapping(source = "productPrice",target = "price"),})ProductVO pojo2vo(Product product);List<ProductVO> list2vo(List<Product> list);/*** 多个参数中的值绑定** @param product 源1* @param category 源2* @return 从源1、2中提取出的结果*/@Mappings({@Mapping(source = "product.productName", target = "product"), //把product中的productName绑定到目标对象的product属性中@Mapping(source = "category.categoryName", target = "category")//把category中的categoryName绑定到目标对象的category属性中})OrderVO createOrder(Product product, Category category);
}
4.2. 测试
@Testpublic void order(){Product product = new Product(1, "电脑", new BigDecimal(6000),1);Category category = new Category("电子产品");OrderVO order = ProductMapper.mapper.createOrder(product, category);System.out.println(order);}
五、自定义类型转换

例如:查询数据库某个段值为0或者1,但是需求中,如果是1就返回true 0返回 false
例如:查询数据库某个段值为0或者1,但是页面显示男或者女

5.1. mapper定义
@Mapper
public interface ProductMapper {/*** 获取该类自动生成的实现类的实例* 接口中的属性都是 public static final 的 方法都是public abstract的*/ProductMapper mapper = Mappers.getMapper(ProductMapper.class);/*** 这个方法就是用于实现对象属性复制的方法** @param product 这个参数就是源对象,也就是需要被复制的对象* @return 返回的是目标对象,就是最终的结果对象* @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性*/@Mappings({@Mapping(source = "productId",target = "id"),@Mapping(source = "productName",target = "name"),@Mapping(source = "productPrice",target = "price"),@Mapping(source = "productStatus",target = "status",qualifiedByName = "convertStatus")})ProductVO pojo2vo(Product product);/*** 提供默认方法,方法自己定义,这个方法是我根据实际业务写的* @return*/@Named("convertStatus")default Boolean convertStatus(Integer status){if(status == 1) {return true;}return false;}public abstract List<ProductVO> list2vo(List<Product> list);/*** 多个参数中的值绑定** @param product 源1* @param category 源2* @return 从源1、2中提取出的结果*/@Mappings({@Mapping(source = "product.productName", target = "product"), //把product中的productName绑定到目标对象的product属性中@Mapping(source = "category.categoryName", target = "category")//把category中的categoryName绑定到目标对象的category属性中})OrderVO createOrder(Product product, Category category);
}
5.2. 测试
@Testpublic void test() {Product product = new Product(1,"电脑", new BigDecimal(6000),1);ProductVO productVO = ProductMapper.mapper.pojo2vo(product);System.out.println(productVO);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过可视化的方式实现Linux和Windows互相传送文件[命令]

文章目录&#x1f3b5;安装&#x1f3b5;使用&#x1f496;1.上传文件&#x1f496;2. 下载文件&#x1f3b5;总结&#x1f3b5;安装 【Centos】 yum install -y lrzsz&#x1f3b5;使用 &#x1f496;1.上传文件 rz -y&#x1f496;2. 下载文件 sz filename&#x1f3b5;…

万字长文丨1分36秒,100亿,支付宝技术双11答卷:没有不可能

2019年双11来了。1分36秒100亿&#xff0c;5分25秒超过300亿&#xff0c;12分49秒超500亿……如果没有双11&#xff0c;中国的互联网技术要发展到今天的水平&#xff0c;或许要再多花20年。 从双11诞生至今的11年里&#xff0c;有一个场景始终在支付宝技术团队之中循环往复——…

大数据 Spark :利用电影观看记录数据,进行电影推荐 | 原力计划

作者 | lomtom责编 | 王晓曼出品 | CSDN博客准备1、任务描述在推荐领域有一个著名的开放测试集&#xff0c;下载链接是&#xff1a;http://grouplens.org/datasets/movielens/&#xff0c;该测试集包含三个文件&#xff0c;分别是ratings.dat、sers.dat、movies.dat&#xff0c…

NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifest

这样写就可解决 <properties><java.version>1.8</java.version><mapstruct.version>1.4.1.Final</mapstruct.version></properties><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</arti…

大家都关注的Serverless,阿里怎么做的?

作者|陈仲寅&#xff08;张挺&#xff09; 出品|阿里巴巴新零售淘系技术部 本文是阿里巴巴前端技术专家-张挺&#xff0c;在 JSConf China 「中国开发者大会」上分享的《面向传统&#xff0c;Serverless 进化之路》&#xff0c;主要讲述阿里集团内部逐步迁移到 Serverless 体系…

我的第一个Go程序

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 文章目录介绍技术网站入门程序介绍 &#x1f4a1;官网介绍 Go 是一门开放源代码的编程语言&#xff0c;可轻松构建简单&#xff0c;可靠且高效的软件。 &#x1f4a1;百度百科 Go&#xff08;又称 Golang&#xff09;…

全民直播,半年“用云量”暴涨五倍

“618大促”落幕&#xff0c;主要电商平台业绩和用云量再创新高&#xff0c;显示出消费已经复苏。 腾讯云服务了小红书、京东、唯品会、蘑菇街、每日优鲜、贝店、什么值得买等主流电商客户&#xff0c;是国内服务电商客户数量最多、范围最广的云厂商。 其数据显示&#xff0c…

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云&#xff0c;一朵是阿里云&#xff0c;一朵叫其他云。”11月11日晚&#xff0c;阿里巴巴集团CTO张建锋表示&#xff0c;“阿里云不一样&#xff0c;10年前我们从第一行代码写起&#xff0c;构建了中国唯一自研的云操作系统飞天。…

阿里CTO张建锋:明年双11将大规模应用含光AI芯片

11月11日晚&#xff0c;阿里巴巴集团CTO张建锋宣布重磅消息&#xff0c;明年双11将大规模应用平头哥自研的含光AI芯片。 达摩院研发的AI技术已应用于天猫双11的各个场景。未来&#xff0c;这些人工智能应用将会越来越多跑在阿里自研的芯片上。 2019年9月25日杭州云栖大会上&am…

shell脚本报错“^M: bad interpreter”解决方法

文章目录1. 现象2. 先编辑脚本3. 脚本观察4. 脚本格式调整5. 脚本格式查看6. 保存脚本7. 重新运行脚本1. 现象 bash: ./ry.sh: /bin/sh^M: bad interpreter: No such file or directory2. 先编辑脚本 # 首先编辑脚本 [rootnode2 ruoyi]# vim ry.sh# 3. 脚本观察 这时会看到文…

深入解析final关键字的用法

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://blog.breez.work 文章目录介绍解析final属性final方法final参数final类介绍 final用于声明属性【属性不可变】、方法【方法不可覆盖】、类&#xff08;除了抽象类&#xff09;【类不…

出道50年+!乘风破浪的编程语言们,能二次翻红吗?

来源 | 编程技术宇宙责编| Carol继上次哈希表华山论剑之后&#xff0c;比特宇宙编程语言联合委员会又来搞事情了。委员会要做一套全新的系统&#xff0c;涉及后端、前端、客户端三大块&#xff0c;为选择什么样的语言组合拿不定主意。为了体现公平&#xff0c;委员会特举办一次…

Spotify如何使用Cassandra实现个性化推荐

在Spotify我们有超过6000万的活跃用户&#xff0c;他们可以访问超过3000万首歌曲的庞大曲库。用户可以关注成千上万的艺术家和上百个好友&#xff0c;并创建自己的音乐图表。在我们的广告平台上&#xff0c;用户还可以通过体验各种音乐宣传活动&#xff08;专辑发行&#xff0c…

RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)

接上一篇&#xff1a;RuoYi-Vue 部署 Linux环境 若依前后端分离项目&#xff08;jar包nginx 单机版本&#xff09; 前端和后端不在一个服务器上&#xff0c;如何部署呢&#xff1f; 文章目录1. 服务器和软件部署2. 后端部署3. 前端部署4. 登录5. 效果图1. 服务器和软件部署 服…

三个不同线程顺序打印ABC十种写法【并发编程JUC】

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://www.breez.work &#x1f4d6;写法一&#xff1a;使用信号量Semaphore public class Foo {private Semaphore semaphoreB new Semaphore(0);private Semaphore semaphoreC new Sem…

技术直播:数据科学到底该怎么“玩”?

90年代初&#xff0c;王健林抓住的房地产的机遇&#xff0c;现在才敢说“一个亿的小目标”&#xff1b;千禧年后 &#xff0c;“马爸爸”抓住了电商的机遇&#xff0c;现在才能说“我对钱没有兴趣”。今年由于特殊情况&#xff0c;加速了远程办公、在线教育和在线医疗的发展&am…

Apache Flink 为什么能够成为新一代大数据计算引擎?

众所周知&#xff0c;Apache Flink&#xff08;以下简称 Flink&#xff09;最早诞生于欧洲&#xff0c;2014 年由其创始团队捐赠给 Apache 基金会。如同其他诞生之初的项目&#xff0c;它新鲜&#xff0c;它开源&#xff0c;它适应了快速转的世界中更重视的速度与灵活性。 大数…

超燃!支付宝技术双11纪录片《一心一役》全球独家首发

​和过去10年一样&#xff0c;2019年天猫双11又创造了一个全新的纪录。 这个数字背后&#xff0c;是数代支付宝工程师们殚精竭虑、不断突破技术难关。 今年双11之前&#xff0c;小编邀请到11位经历双11的技术同学口述实录&#xff0c;特别筹备了纪录片《一心一役》&#xff0c…

Redis Client On Error: Error: connect ECONNREFUSED 192.168.xxx.105:6379 Config right?

解决方法&#xff1a; 修改配置文件 vim redis.conf#注释 这一行重新启动redis即可 #bind 127.0.0.1 -::1

RabbitMQ消息队列简单异步邮件发送和订单异步处理实战【应用解耦】【异步削峰】

介绍 &#x1f4d6;源码地址&#xff1a; https://gitee.com/breez/mq-shop 介绍 使用RabbitMQ消息队列异步发送短信和邮件、订单异步处理【流量削峰】 软件架构 技术栈 序号名称1SpringBoot2SpringMVC3Mybatis plus4RabbitMQ5SpringBoot Mail 特点: 邮件发送的封装三大发…