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

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

3天内不再提示

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

jf_ro2CN3Fa 来源:toutiao.com 2023-07-10 10:46 次阅读


老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct ,可以轻松优雅的进行转换,简化你的代码。当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。

先贴下官网地址吧:https://mapstruct.org/

废话不多说,上代码:

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"?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

这种异常就是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的接口,编译完成后会自动生成相应的实现类

ee323a9e-1eca-11ee-962d-dac502259ad0.png

然后就可以直接用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);

}

}
ee323a9e-1eca-11ee-962d-dac502259ad0.png

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);
}
ee664ae6-1eca-11ee-962d-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

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);
}

}
ee8890c4-1eca-11ee-962d-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

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);

}
eea4f232-1eca-11ee-962d-dac502259ad0.png


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

    关注

    0

    文章

    338

    浏览量

    14301
  • 开源项目
    +关注

    关注

    0

    文章

    36

    浏览量

    7171

原文标题:别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    THS4509运放给+5V单电源供电,请问输出电压Vo+ - Vo-最大能输出多少V?

    你好,请问这款运放给+5V单电源供电,请问输出电压Vo+ - Vo-最大能输出多少V?
    发表于 08-01 08:16

    奈儿呼啦圈包包,绝不觉得有点蛋疼的设计

    `巴黎时装周上,奈儿推出了一款呼啦圈包包,这款超大的信封式单肩包以奈儿经典的菱形格真皮制成,用两个呼啦圈来做包的支架兼背带。设计师说:这是一款为海边度假打造的产品。你要一个能塞下浴巾的包吧?你可以把它随手放在沙滩上,还能在包
    发表于 10-12 14:35

    声音有PO-PO杂声?

    `大家讨论下这个问题: 一个继电器去切换A B两路功放的声音, 一个喇叭发声, 在切换的过程中有PO-PO声音 ,每次切换到A或者切换到B 都有PO的一声 ! 大伙帮忙分析下,多谢!`
    发表于 11-16 15:36

    厉害了word哥,这款手机无线充电产品牛掰,你们怎么看啊?

    今天无意间在淘宝发现这款手机无线充电神器。  在网上搜下,它叫MAGQI,在家里,车上,户外都可以给手机无线充电。  这里分享给下,大家看看有什么想法?  家里使用:  车上使用 
    发表于 01-03 15:10

    请问有人熟悉MSK4351这款IPM智能功率芯片这款芯片的外围电路怎么搭建?有做过的

    本帖最后由 一只耳朵怪 于 2018-6-6 08:54 编辑 用MSK4351做无刷直流电机的驱动芯片,但是datasheet看的云里雾里的!这款芯片的外围电路怎么搭建?有做过的
    发表于 06-05 20:34

    千万别再用这台示波器,我怕你会爱上它!

    千万别再用这台示波器,我怕你会爱上它!
    发表于 05-30 21:01

    iOS版饿使用的开源项目

    前不久,猿妹才发现支付宝使用了三十多款开源软件,今天打开饿发现,饿也使用了33款开源软件。
    的头像 发表于 05-31 14:24 8682次阅读

    体验未来饿无人机配送外卖服务

    在2017年世界无人系统大会上,饿首次公开亮相其外卖无人机,展示的是饿内部研发的第3代产品“E7”(中文名:翼),饿
    发表于 07-18 00:42 2090次阅读

    苹果iPhone 13系列真的那么吗?

    九月将至,广大果粉们期盼已久的 iPhone 13 近在眼前。拥有我国知名食品调料品牌“倾情代言”的 iPhone 13 系列,真的那么吗? 这就体现出不同文化之间的差异。最近一项针对国外
    的头像 发表于 06-28 10:41 2690次阅读

    PO VO DTO转换神器的思路

    当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。 pom 配置: properties
    的头像 发表于 10-12 11:13 1427次阅读

    MapStruct是用来做什么的

    首先来了解一下DTODTO简单的理解就是做数据传输对象的,类似于VO,但是VO用于传输到前端。
    的头像 发表于 06-15 17:02 1576次阅读

    如何分清POVO、DAO、BO、DTO、POJO?

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
    发表于 03-07 09:38 1232次阅读

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

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

    深入浅出聊PLC技术,无线智能家居瞬间「」?

    近两年,PLC技术在智能家居领域刷出了存在感。尤其是在华为的推动下,PLC成为了一种「触手可得」的全屋智能解决方案,让WiFi、ZigBee、蓝牙等技术瞬间「」。本文,「智哪儿」从三个方面解读
    的头像 发表于 04-15 14:56 2513次阅读
    深入浅出聊PLC技术,无线智能家居瞬间「<b class='flag-5'>不</b><b class='flag-5'>香</b><b class='flag-5'>了</b>」?

    别再用offset和limit分页,OFFSET和LIMIT有什么问题?

    不需要担心数据库性能优化问题的日子已经一去不复返
    的头像 发表于 08-11 09:37 736次阅读
    <b class='flag-5'>别再用</b>offset和limit分页<b class='flag-5'>了</b>,OFFSET和LIMIT有什么问题?