0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PO VO DTO转换神器的思路

Linux爱好者 来源:今日头条 作者:bettermann 2021-10-12 11:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。

pom 配置:

<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<org.mapstruct.version>1.4.1.Finalorg.mapstruct.version>
<org.projectlombok.version>1.18.12org.projectlombok.version>
properties>

<dependencies>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstructartifactId>
<version>${org.mapstruct.version}version>
dependency>


<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${org.projectlombok.version}version>
<scope>providedscope>
dependency>


<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>${org.mapstruct.version}version>
<scope>providedscope>
dependency>

dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${org.projectlombok.version}version>
path>
<path>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>${org.mapstruct.version}version>
path>
annotationProcessorPaths>
configuration>
plugin>
plugins>
build>

关于lombok和mapstruct的版本兼容问题多说几句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外编译的lombok mapstruct的插件不要忘了加上。否则会出现下面的错误:No property named "aaa" exists in source parameter(s). Did you mean "null"?

这种异常就是lombok编译异常导致缺少get setter方法造成的。还有就是缺少构造函数也会抛异常。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
publicclassStudent{

privateStringname;
privateintage;
privateGenderEnumgender;
privateDoubleheight;
privateDatebirthday;

}
publicenumGenderEnum{
Male("1","男"),
Female("0","女");

privateStringcode;
privateStringname;

publicStringgetCode(){
returnthis.code;
}

publicStringgetName(){
returnthis.name;
}

GenderEnum(Stringcode,Stringname){
this.code=code;
this.name=name;
}
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
publicclassStudentVO{
privateStringname;
privateintage;
privateStringgender;
privateDoubleheight;
privateStringbirthday;
}
@Mapper
publicinterfaceStudentMapper{

StudentMapperINSTANCE=Mappers.getMapper(StudentMapper.class);

@Mapping(source="gender.name",target="gender")
@Mapping(source="birthday",target="birthday",dateFormat="yyyy-MM-ddHHss")
StudentVOstudent2StudentVO(Studentstudent);

}

实体类是开发过程少不了的,就算是用工具生成肯定也是要有的,需要手写的部分就是这个Mapper的接口,编译完成后会自动生成相应的实现类

然后就可以直接用mapper进行实体的转换了

publicclassTest{

publicstaticvoidmain(String[]args){

Studentstudent=Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(newDate()).build();
System.out.println(student);
//这行代码便是实际要用的代码
StudentVOstudentVO=StudentMapper.INSTANCE.student2StudentVO(student);
System.out.println(studentVO);

}

}

mapper可以进行字段映射,改变字段类型,指定格式化的方式,包括一些日期的默认处理。

可以手动指定格式化的方法:

@Mapper
publicinterfaceStudentMapper{

StudentMapperINSTANCE=Mappers.getMapper(StudentMapper.class);

@Mapping(source="gender",target="gender")
@Mapping(source="birthday",target="birthday",dateFormat="yyyy-MM-ddHHss")
StudentVOstudent2StudentVO(Studentstudent);

defaultStringgetGenderName(GenderEnumgender){
returngender.getName();
}

}

上面只是最简单的实体映射处理,下面介绍一些高级用法

1.List 转换

属性映射基于上面的mapping配置

@Mapper
publicinterfaceStudentMapper{

StudentMapperINSTANCE=Mappers.getMapper(StudentMapper.class);

@Mapping(source="gender.name",target="gender")
@Mapping(source="birthday",target="birthday",dateFormat="yyyy-MM-ddHHss")
StudentVOstudent2StudentVO(Studentstudent);


Liststudents2StudentVOs(ListstudentList);

}
publicstaticvoidmain(String[]args){

Studentstudent=Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(newDate()).build();

Listlist=newArrayList<>();
list.add(student);
Listresult=StudentMapper.INSTANCE.students2StudentVOs(list);
System.out.println(result);
}

2.多对象转换到一个对象

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
publicclassStudent{

privateStringname;
privateintage;
privateGenderEnumgender;
privateDoubleheight;
privateDatebirthday;

}
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
publicclassCourse{

privateStringcourseName;
privateintsortNo;
privatelongid;

}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
publicclassStudentVO{
privateStringname;
privateintage;
privateStringgender;
privateDoubleheight;
privateStringbirthday;
privateStringcourse;
}
@Mapper
publicinterfaceStudentMapper{

StudentMapperINSTANCE=Mappers.getMapper(StudentMapper.class);

@Mapping(source="student.gender.name",target="gender")
@Mapping(source="student.birthday",target="birthday",dateFormat="yyyy-MM-ddHHss")
@Mapping(source="course.courseName",target="course")
StudentVOstudentAndCourse2StudentVO(Studentstudent,Coursecourse);

}
publicclassTest{

publicstaticvoidmain(String[]args){

Studentstudent=Student.builder().name("小明").age(6).gender(GenderEnum.Male).height(121.1).birthday(newDate()).build();
Coursecourse=Course.builder().id(1L).courseName("语文").build();

StudentVOstudentVO=StudentMapper.INSTANCE.studentAndCourse2StudentVO(student,course);
System.out.println(studentVO);
}

}

3.默认值

@Mapper
publicinterfaceStudentMapper{

StudentMapperINSTANCE=Mappers.getMapper(StudentMapper.class);

@Mapping(source="student.gender.name",target="gender")
@Mapping(source="student.birthday",target="birthday",dateFormat="yyyy-MM-ddHHss")
@Mapping(source="course.courseName",target="course")
@Mapping(target="name",source="student.name",defaultValue="张三")
StudentVOstudentAndCourse2StudentVO(Studentstudent,Coursecourse);

}

	

		

转自:toutiao.com/i6891531055631696395

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    9465

    浏览量

    157261
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74538
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SY100EL16VO:3.3V/5V 800MHz精密PECL放大器的技术剖析

    SY100EL16VO:3.3V/5V 800MHz精密PECL放大器的技术剖析 在电子设计领域,放大器是不可或缺的基础元件。今天我们要深入探讨的是Micrel公司的SY100EL16VO,一款专为
    的头像 发表于 04-08 15:40 209次阅读

    变频器维修的思路及步骤

    变频器维修的思路及步骤
    发表于 03-30 16:33 1次下载

    高性能散热膜 | 助力直播神器随行 WiFi X

    据报道,IT之家3月11日消息,在今日的华为鸿蒙智家技术沟通会上,华为随行WiFiX正式发布。华为随行WiFiX的宣传语为“超级直播神器”,该产品已在2025年底首次亮相,适用于户外直播和移动创作
    的头像 发表于 03-14 07:52 633次阅读
    高性能散热膜 | 助力直播<b class='flag-5'>神器</b>随行 WiFi X

    LTC3330:纳米功耗的能量采集与电池续航神器

    LTC3330:纳米功耗的能量采集与电池续航神器 在电子设备的设计中,如何高效地利用能量并延长电池寿命一直是工程师们关注的焦点。今天,我们将深入探讨 Linear Technology 公司
    的头像 发表于 03-10 10:15 253次阅读

    疆鸿智能让PROFINET与CANopen无缝对话:揭秘智慧物流的“网关”神器

    疆鸿智能让PROFINET与CANopen无缝对话:揭秘智慧物流的“网关”神器 随着工业4.0和智能制造的深入推进,工业现场总线技术正在经历一场深刻的变革。在复杂的自动化产线中,没有任何一种通讯协议
    的头像 发表于 02-24 15:49 291次阅读
    疆鸿智能让PROFINET与CANopen无缝对话:揭秘智慧物流的“网关”<b class='flag-5'>神器</b>

    5大理由:声学工程师为何依赖 GRAS 40PO 系列实现稳定、可扩展的测试

    当声学验证需要兼顾可重复性与测量速度时,测量链中任何微小的低效环节都可能产生叠加影响。无论您正在验证移动设备、音频电子设备还是声学传感器,传声器都不应成为变量因素。GRAS40PO-L和40PO
    的头像 发表于 11-17 09:04 1094次阅读
    5大理由:声学工程师为何依赖 GRAS 40<b class='flag-5'>PO</b> 系列实现稳定、可扩展的测试

    CW32的ADC视线,DMA扩展采样思路

    如果需要对超过 4 路的模拟量进行采样,则需要结合 DMA 的功能,以实现较少的 CPU 参与。其思路如下: 1.ADC 配置为单通道单次转换,完成转换后硬件触发 DMA; 2.DMA
    发表于 11-13 08:09

    椭偏光谱技术在VO₂薄膜光诱导IMT中的应用:瞬态介电函数的动力学路径解析

    二氧化钒(VO₂)作为一种强关联电子材料,在约68°C时会发生绝缘体-金属相变(IMT),并伴随晶体结构变化,这一现象使其在超快光子器件(如光开关和调制器)中具有巨大应用潜力。然而,要实现对其光诱导
    的头像 发表于 11-12 18:02 727次阅读
    椭偏光谱技术在<b class='flag-5'>VO</b>₂薄膜光诱导IMT中的应用:瞬态介电函数的动力学路径解析

    Vishay VO1401AEF固态继电器技术深度解析

    通电阻和 3750V~RMS~ 隔离测试电压。VO1401AEF固态继电器提供无抖动的开关操作,并配有与TTL/CMOS兼容的输入。该继电器用于安防系统、仪器仪表和工业控制应用。
    的头像 发表于 11-10 15:43 969次阅读
    Vishay <b class='flag-5'>VO</b>1401AEF固态继电器技术深度解析

    协议转换神器!Profinet转Devicenet秒通,数据无缝集成

    在现代工业自动化领域,不同厂商的设备往往采用不同的通信协议,导致系统集成面临挑战。尤其在新材料生产领域,如不锈钢宽板冷轧生产线,高精度、高实时性的通信需求使得协议转换成为关键环节。其中,将
    的头像 发表于 09-11 16:18 586次阅读
    协议<b class='flag-5'>转换</b><b class='flag-5'>神器</b>!Profinet转Devicenet秒通,数据无缝集成

    【精选直播】无感FOC控制中滑模观测器估算转子角度思路分享

    直播预告扫码购买课程&预约直播直播亮点1、FOC无感控制框图分析2、电机数学模型回顾3、转子位置角求取思路4、滑模观测器思路分享5、滑模观测器的实现直播大纲1、无感FOC控制框图分析2、电机
    的头像 发表于 08-05 08:06 1376次阅读
    【精选直播】无感FOC控制中滑模观测器估算转子角度<b class='flag-5'>思路</b>分享

    开关电源维修思路及常见故障

    开关电源的维修思路及常见故障处理是电子技术人员需要掌握的重要技能。以下是对开关电源维修思路及常见故障的详细分析。   一、开关电源维修思路 1. 断电检查:     ●  外观检查:打开电源的外壳
    的头像 发表于 08-03 07:38 3178次阅读

    流量计连接神器 CClinkie转Modbus RTU:工程师的「断舍离」指南

    不必要的成本。有没有一种\"断舍离\"的方法,让工程师摆脱这个烦恼?答案就是耐达讯通信技术CClinkie转Modbus RTU的转换方案。 方案概述: CClinkie转
    发表于 06-24 13:53

    (ST大赛三等奖作品)超声波自拍神器实例项目

    (ST大赛三等奖作品)超声波自拍神器电路图:
    发表于 05-28 21:04

    CCLINKIE转PROFINET:电机的“网络冲浪神器”!

    PROFINET的大家庭。有了它,电机就像装上了“智能小马达”,和其他设备的配合那叫一个默契,生产效率直接“起飞”! 在这里,我必须给大家推荐一款“神器”——耐达讯NY-N831 -CCLINKIE网关。这
    发表于 05-28 15:21