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

    文章

    9365

    浏览量

    155123
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    全屋灯光秒变聪明,这个提升幸福感的神器你还没安排吗?

    全屋灯光秒变聪明这个提升幸福感的神器你还没安排吗?我宝子们,你是否受够了摸黑找开关的狼狈、手动调光的繁琐,或是永远调不出理想氛围的无奈?作为专注智能灯控方案的我们,今天就来揭秘——如何让家里的灯光
    的头像 发表于 05-14 18:15 1038次阅读
    全屋灯光秒变聪明,这个提升幸福感的<b class='flag-5'>神器</b>你还没安排吗?

    计算机网络排错思路总结

    明人不说暗话,这篇文章我们来聊一个非常有用,同时也是程序员必备的技能,那就是网络排错思路大总结。
    的头像 发表于 04-01 17:32 647次阅读
    计算机网络排错<b class='flag-5'>思路</b>总结

    使用nonai_2d的CRC功能进行图像类型转换,nonai_2d模块的要如何使用?

    我希望使用nonai_2d的CRC功能进行图像类型转换,参考sample_mcm例程添加了对应的start和exit,并且做了sys_bind,也申请了vb,但是运行之后系统一直提示类似没有缓冲区
    发表于 03-11 06:44

    XTR108 Vo端可以输出0.5-2.5V电压,而Io端口却无法输出4-20mA电流,为什么?

    使用万用表可以测到Vo端子的电压正常,但Io端口无法输出正常电压,Io接的负载电阻为150Ω,断电时测得电阻40Ω,应该是芯片内部有电阻与其并联,即电阻应该是正常的。不知道是什么问题?
    发表于 01-08 07:44

    TI_SN74LVC2G125DCUR为什么会有两个Vo输出,每个都代表什么意思?

    如上图红色圆圈部分,为什么会有两个Vo输出,每个都代表什么意思?以及为什么没有在手册中看到关于输入阻抗?
    发表于 01-07 08:15

    DAC8550输出公式为Vo=VREF/2+VREF*D/65536,上电初始,程序没有运行时D的值是多少?

    DAC输出公式为Vo=VREF/2+VREF*D/65536,上电初始,程序没有运行时D的值是多少?
    发表于 12-16 07:32

    BUCK电路占空比对转换效率的影响

    周期T_SW的比例,计算公式为D=T_ON/T_SW。在BUCK电路中,占空比D还可以根据伏秒积平衡原理计算,即VIN*TON=VO*TOFF,从而得出D=Vo/Vin(在忽略开关管和电感等元件的压降时)。这里的Vo是输出电压,
    的头像 发表于 12-12 15:39 4439次阅读

    FPGA打砖块小游戏设计思路

    HDL, Vivado 平台上开发打砖块小游戏并使用 PS2 与 VGA 的基本思路: 一、整体架构设计 1. 输入模块: • PS2 接口模块:负责与 PS2 设备(如游戏手柄)进行通信,接收手柄
    的头像 发表于 12-09 16:57 1462次阅读