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

    文章

    8172

    浏览量

    141575
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66645
收藏 人收藏

    评论

    相关推荐

    基于VO2忆阻器的无线物联网混合系统

    针对此问题,北京大学集成电路学院/集成电路高精尖创新中心的杨玉超教授团队首次提出以VO2 忆阻器为主体的高一致性、可校准的频率振荡器,在此基础上构建了8×8的VO2 忆阻器阵列,通过紧凑设计的外围电路实现了频率现场生成和可编程频率混合系统。
    的头像 发表于 02-22 09:30 162次阅读

    VO2750 蓄电池放电测试仪使用说明书

    电子发烧友网站提供《VO2750 蓄电池放电测试仪使用说明书.pdf》资料免费下载
    发表于 02-01 10:09 0次下载

    工业自动化协议转换网关BL121PO PLC To OPC UA 网关产品介绍

    电子发烧友网站提供《工业自动化协议转换网关BL121PO PLC To OPC UA 网关产品介绍.pdf》资料免费下载
    发表于 01-26 14:36 0次下载

    介绍一款基于java的渗透测试神器-CobaltStrike

    Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器
    的头像 发表于 01-16 09:16 269次阅读
    介绍一款基于java的渗透测试<b class='flag-5'>神器</b>-CobaltStrike

    共模电容:又一款EMC滤波神器

    共模电容:又一款EMC滤波神器?|深圳比创达电子(上)
    的头像 发表于 12-25 10:54 286次阅读
    共模电容:又一款EMC滤波<b class='flag-5'>神器</b>?

    准谐振变换器的基本思路

    准谐振变换器是一种特殊类型的电源转换器,其工作原理与常规的电源转换器有所不同。它采用谐振原理,将交流电压转换为直流电压,或者将直流电压转换为交流电压。本文将详细介绍准谐振变换器的基本
    的头像 发表于 12-14 17:12 658次阅读

    OP191在VO为+-5V输出电流比datasheet给出的值大很多的原因?

    我在测试VO=+-5V时,VS接的+-5V,测试出来其 SUPPLY Current在VO=0条件下,比datasheet给出的值大很多。请问是什么原因造成的。
    发表于 11-20 06:29

    ESD静电整改有什么基本思路

    ESD静电整改有什么基本思路?|深圳比创达电子EMC
    的头像 发表于 11-02 10:08 365次阅读

    协议转换神器,从Modbus到多种总线协议,随心切换

    更多往期文章,请点击“  阅读原文  ”。 原文标题:协议转换神器,从Modbus到多种总线协议,随心切换 文章出处:【微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 08-02 11:45 392次阅读
    协议<b class='flag-5'>转换</b><b class='flag-5'>神器</b>,从Modbus到多种总线协议,随心切换

    别再用BeanUtils了,这款PO VO DTO转换神器不香么?

    关于lombok和mapstruct的版本兼容问题多说几句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外编译的lombok mapstruct的插件不要忘了加上。
    的头像 发表于 07-10 10:46 313次阅读
    别再用BeanUtils了,这款<b class='flag-5'>PO</b> <b class='flag-5'>VO</b> <b class='flag-5'>DTO</b><b class='flag-5'>转换</b><b class='flag-5'>神器</b>不香么?

    无所不知的神器构建

    电子发烧友网站提供《无所不知的神器构建.zip》资料免费下载
    发表于 07-04 11:22 0次下载
    无所不知的<b class='flag-5'>神器</b>构建

    ESP8266连接到Li Po时无法启动怎么解决?

    嗨, 我有一个 Wemos D1 Mini ESP8266 模块,我正试图通过 MT3608 升压模块从 2400 mAh 锂聚合物电池运行。接线简单: Li-Po正负极分别接MT3608的VIN+
    发表于 05-29 06:33

    POVO、DAO、BO、DTO、POJO应该怎么分层

    一个项目中不一定都能用得上全部的分层规约,但十分有必要了解每一种的用法,便于去阅读其他人的代码。同样的,虽然遵守规约写代码可能会略微拉低你写代码的速度(PS:多写一些实体类),但越是规范化,模板化的东西,后期的维护成本和学习成本会越低。
    的头像 发表于 05-18 11:00 685次阅读

    【新品发布】协议转换神器,从Modbus到多种总线协议,随心切换

    原文标题:【新品发布】协议转换神器,从Modbus到多种总线协议,随心切换 文章出处:【微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 05-11 20:16 445次阅读
    【新品发布】协议<b class='flag-5'>转换</b><b class='flag-5'>神器</b>,从Modbus到多种总线协议,随心切换

    关于超温报警电路求设计思路

    我想制作一个超温报警电路,采集的信号是10-30mv之间的,我想的方法是采用单片机里面自带的AD电路,直接进行采样,不用放大。因为放大就会引入误差,还有采用仪表放大器的话,还需要加入电源转换电路
    发表于 04-20 15:26