Mapstruct使用介绍

一:使用背景

我们在读库之后(po->dto),返回前端数据(dto->vo)的需要转换函数,这时候我们一般会有以下几种方式

1:手动编写convert函数

2:利用反射工具进行映射(spring的BeanUtils, fastjson的JSON.parseObject)

3:利用工具生成convert函数(Mapstruct)

个人比较偏好Mapstruct,手动写convert函数比较繁琐,而且很多转换的过程中属性名和属性类型都是相同的。

反射工具进行映射的性能无法保证,也可能出现问题(比如fastjson已经被人在社区中提出bug)。

二:使用姿势

实例一(字段完全相同)

1:在pom.xml中引入依赖。

<dependency><groupid>junit</groupid><artifactid>junit</artifactid><version>4.11</version><scope>test</scope>
</dependency>
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.5.1</version><configuration><source>1.8<target>1.8</target><annotationprocessorpaths><path><groupid>org.mapstruct</groupid><artifactid>mapstruct-processor</artifactid><version>1.3.0.Beta2</version></path></annotationprocessorpaths></configuration>
</plugin>

2:编写要转换的两个实体类

package controller;/*** @date: 2019/10/24* @description: SimpleSource*/
public class SimpleSource {private String name;private String description;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}
package controller;/*** @date: 2019/10/24* @description: SimpleDestination*/
public class SimpleDestination {private String name;private String description;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

3:编写要映射的Mapper接口

package controller;
import org.mapstruct.Mapper;@Mapper
public interface SimpleSourceDestinationMapper {SimpleDestination sourceToDestination(SimpleSource source);SimpleSource destinationToSource(SimpleDestination destination);
}

4:mvn clean install生成要转换的convert函数(生成的代码在target文件夹下)

5:生成代码

package controller;import javax.annotation.Generated;public class SimpleSourceDestinationMapperImpl implements SimpleSourceDestinationMapper {@Overridepublic SimpleDestination sourceToDestination(SimpleSource source) {if ( source == null ) {return null;}SimpleDestination simpleDestination = new SimpleDestination();simpleDestination.setName( source.getName() );simpleDestination.setDescription( source.getDescription() );return simpleDestination;}@Overridepublic SimpleSource destinationToSource(SimpleDestination destination) {if ( destination == null ) {return null;}SimpleSource simpleSource = new SimpleSource();simpleSource.setName( destination.getName() );simpleSource.setDescription( destination.getDescription() );return simpleSource;}
}

实例二(字段有差异)

1:编写要转换的两个实体类

package controller;/*** @date: 2019/10/24* @description: Person实体类*/
public class Person {private String name;private String sex;private Integer age;private String tall;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getTall() {return tall;}public void setTall(String tall) {this.tall = tall;}
}
package controller;/*** @date: 2019/10/24* @description: 学生实体类*/
public class Student {private String name;private String sex;private Integer age;private Long height;private Integer rank;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Long getHeight() {return height;}public void setHeight(Long height) {this.height = height;}public Integer getRank() {return rank;}public void setRank(Integer rank) {this.rank = rank;}
}

2:编写要映射的Mapper接口()

package controller;import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper
public interface PersonMapper
{@Mappings({@Mapping(source = "tall", target = "height"),})Student personToStudent(Person person);
}

3:生成的Mapper实现类的位置

4:生成的代码

package controller;import javax.annotation.Generated;public class PersonMapperImpl implements PersonMapper {@Overridepublic Student personToStudent(Person person) {if ( person == null ) {return null;}Student student = new Student();if ( person.getTall() != null ) {student.setHeight( Long.parseLong( person.getTall() ) );}student.setName( person.getName() );student.setSex( person.getSex() );student.setAge( person.getAge() );return student;}
}

三:注意事项

1:要映射的源实体类和目的实体类要写setter

2:要映射的源实体类和目的实体类不要写全参数的构造函数(否则未自动映射的字段并且未处理的字段会有问题)。

Mapstruct使用介绍相关推荐

  1. Mapstruct使用说明(一)

    在使用分层或者分模块化的项目中,我们可能定义各种各样的O,例如:DO,VO,DTO等等.我们在进行这些对象之间的拷贝时,通过手动写get/set方法进行属性之间的赋值.因为他们之间的属性大部分都是相同 ...

  2. Mapstruct中类型的映射规则(二)

    上一篇文章主要讲解了Mapstruct的介绍.Mapstruct的优缺点.MapStruct简单的映射示例以及和常见的映射工具做了性能上的对比. 这篇文章主要讲解Mapstruct的属性之间的映射规则 ...

  3. JavaBeans映射工具比较

    JavaBeans映射工具比较 BeanUtils BeanCopier Orika 多对一 List映射 MapStruct Orika.MapStruct耗时比较 定义一些基础对象 // 定义转换 ...

  4. MAPSTRUCT(@Mapper用法)简单介绍

    MAPSTRUCT(@Mapper用法) 官网地址:http://mapstruct.org/ MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个 ...

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

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

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

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

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

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

  8. java 实体属性个数_?Java中比较实用实体转换工具介绍

    ​Java中比较实用实体转换工具介绍 文中源码地址 大家一般编码过程中,经常会遇到DO对象转化为DTO对象,对象和对象之间转换一般需要用到转换工具,毕竟使用getter/setter太过麻烦 DO:D ...

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

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

  10. kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct

    原文:https://zhuanlan.zhihu.com/p/208525542 一. data class 的 copy() 为浅拷贝 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对 ...

最新文章

  1. zuul框架设计与实现
  2. 百度百科中关于fwrite的用法说明
  3. PowerDesigner表结构和字段大小写转换
  4. 学习重要,还是学会学习重要
  5. mysql mssql 性能对比_MySQL最新版8.0与5.7之性能对比,看看它是如何改进的
  6. leetcode python3 简单题168. Excel Sheet Column Title
  7. 云端部署大数据解决方案该用IaaS还是PaaS?
  8. python中连接函数_python-使用参数连接到函数
  9. IGT-DSER智能网关不用PLC编程,实现多台不同品牌PLC之间的通讯案例
  10. RTC 技术的试金石:火山引擎视频会议场景技术实践
  11. 机器人把大龙拉出来_英雄联盟之我的电竞梦
  12. 数字调制系统工作原理_图文讲解液压系统溢流阀分类与工作原理
  13. Java pdf图书下载网站整理
  14. Unity3D学习笔记(1)编辑器概括
  15. 爱因斯坦论教育,放在首位的该是什么?1936年美国高等教育300周年会(公号回复“爱因斯坦教育”下载PDF典藏版,欢迎转发赞赏)
  16. ObjectPostProcessor使用与多种用户定义方式(9)
  17. python3 关键字,内建函数
  18. 导航栏的使用(ToolBar、BottomNavgationView)
  19. 企业员工虚拟股权激励制度
  20. 这笔投资你算过吗?―写给二本院校的苦逼青年

热门文章

  1. Excel绘制折线图--更新中。。。
  2. C/C++编程笔记:浪漫流星雨装b表白程序
  3. 转:: 刺鸟:用python来开发webgame服务端(4)
  4. 40个布局排版好看的网页设计作品
  5. win10 +cude9.2+相匹配的cudnn+相匹配的tensorflow+ssd学习之路(问题百出1)
  6. Oracle中insert into select和select into from的用法
  7. 团队管理之—— 大项目:把握关键点,谋定而后动
  8. 华三模拟器(防火墙)实现IPSEC穿越NAT实验
  9. word2016自动目录样式修改
  10. Python:利用xlwt设置Excel单元格格式