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);}
MapStruct 常用操作相关推荐
- TensorFlow常用操作:代码示例
1,定义矩阵代码示例: import tensorflow as tftf.zeros([3,4]) #定义3行4列元素均为0的矩阵tensor=tf.constant([1,2,3,4])#定义一维 ...
- Ubuntu 常用操作
Ubuntu常用操作 外观操作 修改应用icon图标 终端美化 内存管理 内存查询 分区管理 日志清理 操作执行 自动执行多条命令 外观操作 修改应用icon图标 在/usr/share/applic ...
- IOS沙盒Files目录说明和常用操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- 用Python轻松搞定Excel中的20个常用操作
来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...
- python和R对dataframe的常用操作的差异:head、tail、shape、dim、nrow、ncol、descirbe、summary、str
python和R对dataframe的常用操作的差异:head.tail.shape.dim.nrow.ncol.descirbe.summary.str # python df.head() # R ...
- 【node】Sequelize常用操作、基本增删改查
[node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...
- JavaScript:对Object对象的一些常用操作总结
JavaScript对Object对象的一些常用操作总结. 一.Object.assign() 1.可以用作对象的复制 var obj = { a: 1 }; var copy = Object.as ...
- ubuntu的学习教程(常用操作)
摘要 最近在学习linux,把自己学习过程中遇到的常用操作以及一些有助于理解的内容记录下来.我主要用的是ubuntu系统 命令提示符 '~' 这个是指用户的家目录,用户分为root用户和普通用户,ro ...
- 20180929 VIM进入编辑模式、VIM命令模式常用操作
2019独角兽企业重金招聘Python工程师标准>>> vim进入编辑模式方式 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 a 在当前字符后插入 A 在光标所在行的 ...
最新文章
- 8张图带你理解Java整个只是网络(转载)
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
- Linux上常用命令整理(二)—— paste
- linux中256错误,YUM安装遭遇: [Errno 256] No more mirrors to try
- Mysql ERROR 1067: Invalid default value for ‘auth_time‘
- POJ 1325 Machine Schedule[二分图匹配*最小点覆盖]
- Python生成随机数的方法
- js获取DIV的位置坐标的三种方法!
- Java自动化测试框架-04 - TestNG之Test Method篇 - (详细教程)
- 基于 FPGA 的智力抢答器设计
- VS2015 Cordova Ionic移动开发(一)
- java数据结构银行叫号,数据结构实验二——队列(银行叫号系统)
- RFC2544背靠背测试——信而泰Renix测试软件实操
- Java求所占百分比
- 数字时代的保险创新与升级 | 创新场景50
- 【公司邮箱怎么注册】Foxmail帐户邮箱数据保存在什么地方?如何备份一个帐户?
- 气球java游戏_气球游戏-2019腾讯笔试
- [软件工程] 面向对象分析
- wo de wen zhang
- 智慧停车成为了改善停车环境、满足停车需求的“香饽饽”
热门文章
- 苏联当年有多少应该拿菲尔兹奖的数学家被黑了?
- 江苏师范大学计算机全国排名,国内131所二本师范大学最新排名(按录取分数线)...
- Jmater参数说明
- java如何生成验证码
- MyBatis之优化MyBatis配置文件中的配置
- Springboot 集成 Swagger
- 阿里云PolarDB开源数据库社区与 Tapdata 联合共建开放数据技术生态
- 现实版“奇异博士”?原来是这款神秘的“数学黑盒”
- 阿里云飞天AI加速器+Serverless容器,帮助图森未来提升资源利用率
- 从国际站 - M 站建设谈开发者产品思维