Mapstruct使用介绍
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使用介绍相关推荐
- Mapstruct使用说明(一)
在使用分层或者分模块化的项目中,我们可能定义各种各样的O,例如:DO,VO,DTO等等.我们在进行这些对象之间的拷贝时,通过手动写get/set方法进行属性之间的赋值.因为他们之间的属性大部分都是相同 ...
- Mapstruct中类型的映射规则(二)
上一篇文章主要讲解了Mapstruct的介绍.Mapstruct的优缺点.MapStruct简单的映射示例以及和常见的映射工具做了性能上的对比. 这篇文章主要讲解Mapstruct的属性之间的映射规则 ...
- JavaBeans映射工具比较
JavaBeans映射工具比较 BeanUtils BeanCopier Orika 多对一 List映射 MapStruct Orika.MapStruct耗时比较 定义一些基础对象 // 定义转换 ...
- MAPSTRUCT(@Mapper用法)简单介绍
MAPSTRUCT(@Mapper用法) 官网地址:http://mapstruct.org/ MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个 ...
- 丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 在前几天的文章<为什么阿里巴巴禁止使用Apache Bean ...
- 业务代码的救星——Java对象转换框架MapStruct
介绍 在业务项目的开发中,我们经常需要将Java对象进行转换,比如从外部HSF服务得到的对象转换为本域的业务对象domain object,将domain object转为数据持久层的data obj ...
- java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用
简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...
- java 实体属性个数_?Java中比较实用实体转换工具介绍
Java中比较实用实体转换工具介绍 文中源码地址 大家一般编码过程中,经常会遇到DO对象转化为DTO对象,对象和对象之间转换一般需要用到转换工具,毕竟使用getter/setter太过麻烦 DO:D ...
- 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 介绍 在工作中,我们经常要进 ...
- kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct
原文:https://zhuanlan.zhihu.com/p/208525542 一. data class 的 copy() 为浅拷贝 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对 ...
最新文章
- zuul框架设计与实现
- 百度百科中关于fwrite的用法说明
- PowerDesigner表结构和字段大小写转换
- 学习重要,还是学会学习重要
- mysql mssql 性能对比_MySQL最新版8.0与5.7之性能对比,看看它是如何改进的
- leetcode python3 简单题168. Excel Sheet Column Title
- 云端部署大数据解决方案该用IaaS还是PaaS?
- python中连接函数_python-使用参数连接到函数
- IGT-DSER智能网关不用PLC编程,实现多台不同品牌PLC之间的通讯案例
- RTC 技术的试金石:火山引擎视频会议场景技术实践
- 机器人把大龙拉出来_英雄联盟之我的电竞梦
- 数字调制系统工作原理_图文讲解液压系统溢流阀分类与工作原理
- Java pdf图书下载网站整理
- Unity3D学习笔记(1)编辑器概括
- 爱因斯坦论教育,放在首位的该是什么?1936年美国高等教育300周年会(公号回复“爱因斯坦教育”下载PDF典藏版,欢迎转发赞赏)
- ObjectPostProcessor使用与多种用户定义方式(9)
- python3 关键字,内建函数
- 导航栏的使用(ToolBar、BottomNavgationView)
- 企业员工虚拟股权激励制度
- 这笔投资你算过吗?―写给二本院校的苦逼青年
热门文章
- Excel绘制折线图--更新中。。。
- C/C++编程笔记:浪漫流星雨装b表白程序
- 转:: 刺鸟:用python来开发webgame服务端(4)
- 40个布局排版好看的网页设计作品
- win10 +cude9.2+相匹配的cudnn+相匹配的tensorflow+ssd学习之路(问题百出1)
- Oracle中insert into select和select into from的用法
- 团队管理之—— 大项目:把握关键点,谋定而后动
- 华三模拟器(防火墙)实现IPSEC穿越NAT实验
- word2016自动目录样式修改
- Python:利用xlwt设置Excel单元格格式