一个实体里包含另一个实体list如何实现前后端的功能_如何优雅的转换Bean对象?先这样,然后这样

更新时间:2023-05-25 13:14:55 阅读: 评论:0

⼀个实体⾥包含另⼀个实体list如何实现前后端的功能_如何优雅的转换Bean对象?先这样,然后这样
背景
我们的故事要从⼀个风和⽇丽的下午开始说起!
这天,外包含在位置上写代码~外包含根据如下定义
PO(persistant object): 持久化对象,可以看成是与数据库中的表相映射的 java 对象。最简单的 PO 就是对应数据库中某个表中的⼀条记录。
VO(view object): 视图对象,⽤于展⽰层,它的作⽤是把某个指定页⾯(或组件)的所有数据封装起来。
BO(business object): 业务对象,主要作⽤是把业务逻辑封装为⼀个对象。这个对象可以包括⼀个或多个其它的对象。
DTO、DO(省略…)
将Bean进⾏逐⼀分类!例如⼀个car_tb的表,于是他有了两个类,⼀个叫CarPo,⾥头属性和表字段完全⼀致。另⼀个叫CarVo,⽤于页⾯上的Car显⽰!但是外包含在做CarPo到CarVo转换的时候,代码是这么写的,伪代码如下:
CarPo carPo = this.carDao.lectById(1L);CarVo carVo = new CarVo();carVo.Id());carVo.Name());1234
//省略⼀堆
return carVo;
画外⾳:看到这⼀串代码是不是特别亲切,我接⼿过⼀堆外包留下的代码,就是这么写的,⼀坨屎⼭!⼀类⼏千⾏,⼀半都在t属性。
恰巧,阿雄打⽔路过!鸡贼的阿雄瞄了⼀眼外包韩的屏幕,看到外包韩的这⼀系列代码!上去进⾏⼀顿教育,觉得不够优雅!阿雄觉得,应该⽤pyProperties来简化书写,像下⾯这样!
CarPo carPo = this.carDao.lectById(1L);CarVo carVo = new CarVo();pyProperties(carPo, carVo);return carVo;1234任正非
可是,外包韩盯着这段代码,说道:“⽹上不是说反射效率慢,你这么写,没有性能问题么?”
阿雄说道:" 如果是⽤Apache的BeanUtil类,确实有很⼤的性能问题,像阿⾥巴巴的代码扫描插件,都禁⽌⽤该类,如下所⽰!"
"但是,如果采⽤的是像Spring的BeanUtils类,要在调⽤次数⾜够多的时候,你才能明显的感受到卡顿。"阿雄补充道。
西安都市快报
"哇,阿雄真棒!“外包韩兴奋不已!
民谣吉他谱看着这办公室基情满满的氛围。⼀旁正在拖地的清洁⼯------扫地烟,他决定不再沉默。
只见扫地烟扔掉⼿中的拖把,得瑟的说道"我们不考虑性能。从拓展性⾓度看看!BeanUtils还是有很多问题的!”
复制对象时字段类型不⼀致,导致复制不上,你怎么解决?⾃⼰拓展?
复制对象时字段名称不⼀致,例如CarPo⾥叫carName,CarVo⾥叫name,导致赋值不上,你怎么解决?⾃⼰拓展?
如果是集合类的复制,例如List转换为List,你怎么处理?
(省略⼀万字…)
最后一课"那应该怎么办呢?"听了扫地烟的描述,外包韩疑惑的问道!
"很简单,其实我们在转换bean的过程中,t这些逻辑是固定的,唯⼀变化的就是转换规则。因此,如果我们只需要书写转换规则,转换代码由系统根据规则⾃动⽣成,就⽅便很多了!还是⽤上⾯的例⼦,CarPo⾥叫carName,CarVo⾥叫name,属性名称不⼀致。我们就通过⼀个注解
@Mapping(source = "carName", target = "name")1
指定对应转换规则。系统识别到这个注解,就会⽣成代码
carVo.CarName())1
如果能以这样的⽅式,t代码由系统⾃动⽣成,那么灵活性将⼤⼤加强,⽽且这种⽅式不存在性能问题!"扫地烟补充道!
静谧的近义词
"那这些t逻辑,由什么⼯具来⽣成呢?"外包韩和阿雄⼀起问道!
“嗯,这个⼯具的名字叫MapStruct!”
ok,上⾯的故事到了这⾥,就结束了!不需要问结局,结局只有⼀个,外包韩和阿雄幸福美满的…(省略10000字)…
那么我们开始具体来说⼀说MapStruct!
MapStruct的教程
这⾥从⽤法、原理、优势三个⾓度来介绍⼀下这个插件,⾄于详细教程,还是看官⽅⽂档吧。
数学反思300字⽤法
引⼊pom⽂件如下
org.mapstruct    mapstruct-jdk8    1.2.0.Finalorg.mapstruct    mapstruct-processor    1.2.0.Final1234567891011
在准备两个实体类,为了⽅便演⽰,⽤了lombok插件。准备两个实体类,⼀个是CarPo
@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class CarPo {    private Integer id;    private String brand;}还有⼀个是CarVo@Data@Builder@NoA 输出如下
CarVo(id=1, brand=BMW)1
可以看到,carPo的属性值复制给了carVo。当然,在这种情况下,功能和BeanUtils是差不多的,体现不出优势!嗯,我们放在后⾯说,
我们先来说说原理!
原理
其实原理就是MapStruct插件会识别我们的接⼝,⽣成⼀个实现类,在实现类中,为我们实现了t逻辑!例如,上⾯的例⼦中,给CarCovertBasic接⼝,⽣成了⼀个实现类CarCovertBasicImpl,我们可以⽤反编译⼯具看到源码如下图所⽰
下⾯,我们来说说优势
优势
(1)两个类型属性不⼀致
此时CarPo的⼀个属性为carName,⽽CarVo对应的属性为name!
我们在接⼝上增加对应关系即可,如下所⽰
@Mapperpublic interface CarCovertBasic {CarCovertBasic INSTANCE = Mapper(CarCovertBasic.class);@Mapping(source = "carName", targ
输出如下
CarVo(id=1, brand=BMW, name=宝马)1
可以看到carVo已经能识别到carPo中的carName属性,并复制成功。反编译的图如下
逖怎么读画外⾳:如果有多个映射关系可以⽤@Mappings注解,嵌套多个@Mapping注解实现,后⽂说明!
(2)集合类型转换
如果我们要从List转换为List怎么办呢?简单,接⼝⾥加⼀个⽅法就⾏
@Mapperpublic interface CarCovertBasic {    CarCovertBasic INSTANCE = Mapper(Car
CovertBasic.class);    @Mapping(source = "carName"
如代码所⽰,我们增加了⼀个toConvertVos⽅法即可,mapStruct⽣成代码的时候,会帮我们去循环调⽤toConvertVo⽅法,给⼤家看
⼀下反编译的代码,就⼀⽬了然
(3)类型不⼀致
在CarPo加⼀个属性为Date类型的createTime,⽽在CarVo加⼀个属性为String类型的createTime,那么代码如下
@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class CarPo {    private Integer id;    private String brand;    private String carName;    priv
接⼝就可以这么写
@Mapperpublic interface CarCovertBasic {    CarCovertBasic INSTANCE = Mapper(CarCovertBasic.class);    @Mappings({        @Mapping(so
这样在代码中,就能解决类型不⼀致的问题!在⽣成t⽅法的时候,⾃动调⽤DateUtil类进⾏转换,由于⽐较简单,我就不贴反编译的图了!
少代会提案(4)多对⼀
在实际业务情况中,我们有时候会遇到将两个Bean映射为⼀个Bean的情况,假设我们此时还有⼀个类为AtrributePo,我们要将CarPo和AttributePo同时映射为CarBo,我们可以这么写
@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class AttributePo {    private double price;    private String color;}@Data@Builder@NoArgs 直接增加接⼝即可,插件在⽣成代码的时候,会帮我们⾃动组装,看看下⾯的反编译代码就⼀⽬了然。
(5)其他
关于MapStruct还有其他很多的⾼级功能,我就不⼀⼀介绍了。
总结
本⽂介绍了,在项⽬⾥如何优雅的转换Bean,希望⼤家有所收获!

本文发布于:2023-05-25 13:14:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/771423.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   对象   转换   复制   属性   扫地   插件   对应
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图