1、什么是DTO、VO、BO、PO、DO、POJO

POJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO、BO、 PO、 DTO

VO (view object/value object)表示层对象

1、前端展示的数据,在接口数据返回给前端的时候需要转成VO

2、个人理解使用场景,接口层服务中,将DTO转成VO,返回给前台

B0(bussines object)业务层对象

1、主要在服务内部使用的业务对象

2、可以包含多个对象,可以用于对象的聚合操作

3、个人理解使用场景,在服务层服务中,由DTO转成BO然后进行业务处理后,转成DTO返回到接口层

PO(persistent object)持久对象

1、出现位置为数据库数据,用来存储数据库提取的数据

2、只存储数据,不包含数据操作

3、个人理解使用场景,在数据库层中,获取的数据库数据存储到PO中,然后转为DTO返回到服务层中

DTO(Data Transfer Object)数据传输对象

1、在服务间的调用中,传输的数据对象

2、个人理解,DTO是可以存在于各层服务中(接口、服务、数据库等等)服务间的交互使用DTO来解耦

DO(domain object)领域实体对象

DO 现在主要有两个版本:

①阿里巴巴的开发手册中的定义,DO( Data Object)这个等同于上面的PO

②DDD(Domain-Driven Design)领域驱动设计中,DO(Domain Object)这个等同于上面的BO

参考文档:

    https://juejin.cn/post/6952848675924082718https://juejin.cn/post/6844904046097072141https://zhuanlan.zhihu.com/p/264675395
复制代码

2、插件如何完成转化

插件名称:Simple Object Copy

  1. 定义方法出入参
  2. 光标定位方法内,使用快捷键ALT+INSERT(WIN) 、 command + N(mac) ,或者右键鼠标选择Generate,弹出生成选项框后,选择genCopyMethod,代码就生成好了

复杂对象转化展示

@Data
public class UserVO {
private String name;
private Date entryDate;
private String userId;
private List roleList;
private RoomVO room;
public static UserVO convertToUserVO(UserDTO item) {if (item == null) {return null;}UserVO result = new UserVO();result.setName(item.getName());result.setEntryDate(item.getEntryDate());result.setUserId(item.getUserId());List<RoleDTO> roleList = item.getRoleList();if (roleList == null) {result.setRoleList(null);} else {result.setRoleList(roleList.stream().map(UserVO::convertToRoleVO).collect(Collectors.toList());}result.setRoom(convertToRoomVO(item.getRoom()));return result;
}public static RoomVO convertToRoomVO(RoomDTO item) {if (item == null) {return null;}RoomVO result = new RoomVO();result.setRoomId(item.getRoomId());result.setBuildingId(item.getBuildingId());result.setRoomName();result.setBuildingName();return result;
}public static RoleVO convertToRoleVO(RoleDTO item) {if (item == null) {return null;}RoleVO result = new RoleVO();result.setRoleId(item.getRoleId());result.setRoleName(item.getRoleName());result.setCreateTime(item.getCreateTime());return result;
}
复制代码
}
@Data
public class UserDTO {
private String name;
private Date entryDate;
private String userId;
private List roleList;
private RoomDTO room;
}
@Data
public class RoleVO {
private String roleId;
private String roleName;
private LocalDateTime createTime;
}
@Data
public class RoleDTO {
private String roleId;
private String roleName;
private LocalDateTime createTime;
}
@Data
public class RoomVO {
private String roomId;
private String buildingId;
private String roomName;
private String buildingName;
}
@Data
public class RoomDTO {
private String roomId;
private String buildingId;
}

3、其他转化方式

1.无入侵 市面上有很多类似的工具类,比较常用的有

  • 1、Spring BeanUtils (copyProperties)
  • 2、Cglib  BeanCopier (copyProperties)
  • 3、Apache BeanUtils (copyProperties)
  • 4、Apache PropertyUtils (copyProperties)
  • 5、Dozer
  • 6、mapstruct
  • 7、JSON 序列化 再反序列化

这些工具,不仅要引入相应的依赖jar包,而且对代码有入侵,要调用对应得api方法才能进行转化,一旦遇到类型不一致,字段名稍有变动,就需要另写java代码补全字段,整体代码非常丑陋。

举例:

1.mapstruct

同样的代码,,不仅要引入依赖、写如下转化mapper,还要,在对应地方调用对应api(代码入侵验证),然而Simple Object Copy 只需要一键生成。

RoomDTO中不存在的roomName、buildingName还要mapstruct另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是null。

在Simple Object Copy 插件代码生成后,不存在的字段也生成了空方法,直接编译提示补充,不容易忽略

需要手写的代码

@Mapper(componentModel = "spring",uses = {RoleVOMapper.class,RoomVOMapper.class})
public interface UserMapper {UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);UserVO toUserVO(UserDTO userDTO);
}@Mapper(componentModel = "spring")
public interface RoleMapper {RoleVO toRoleVO(RoleDTO roleDTO);
}@Mapper(componentModel = "spring")
public interface RoomMapper {RoomVO toRoomVO(RoomDTO roomDTO);
}//调用示例
public class Main {public static void main(String[] args) {UserDTO user = ;UserVO userVO = UserMapper.INSTANCE.toUserVO(user);userVO.getRoomVO().setRoomName("大厅1");userVO.getRoomVO().setBuildingName("尚德楼");}
}复制代码

2.BeanUtils

性能稍差。

不支持复杂对象还是要写大量代码,代码字段不清晰不易理解,别人接手难。

RoomDTO中不存在的roomName、buildingName还要BeanUtils另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是null。

需要手写的代码

@Data
public class UserVO {private String name;private Date entryDate;private String userId;private List<RoleVO> roleList;private RoomVO room;public static UserVO convertToUserVO(UserDTO item) {if (item == null) {return null;}UserVO result = new UserVO();BeanUtils.copyProperties(item,result);List<RoleDTO> roleList = item.getRoleList();if (roleList == null) {result.setRoleList(null);} else {result.setRoleList(roleList.stream().map(UserVO::convertToRoleVO).collect(Collectors.toList());}result.setRoom(convertToRoomVO(item.getRoom()));return result;}public static RoomVO convertToRoomVO(RoomDTO item) {if (item == null) {return null;}RoomVO result = new RoomVO();BeanUtils.copyProperties(item,result);//这里没有代码提示,需要自己写,小心前端总是问为啥都是nullresult.setRoomName();result.setBuildingName();return result;}public static RoleVO convertToRoleVO(RoleDTO item) {if (item == null) {return null;}RoleVO result = new RoleVO();BeanUtils.copyProperties(item,result);return result;}
}

作者:蓝巫
链接:https://juejin.cn/post/7053264631262871583
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.性能优势

相比上面的工具类,不是使用反射、就是是用代理、序列化操作。相比于纯正的set方法去转化,差距不是一个量级。此次不赘述。

3.灵活性、兼容性

跟上述工具类相比插件有很大优势,不再赘述,下面我们比较一下,我之前常用的idea插件generateO2O

我方插件 特点 对比插件 特点
Simple Object Copy 依据返回值为主,根据字段名去匹配 ,不会导致返回值漏属性 generateO2O 以入参为主匹配字段,存在漏属性的情况
Simple Object Copy 支持对象包含对象、对象包含list、set集合的转化 generateO2O 不支持子对象的转化、不支持list泛型不同的转化
Simple Object Copy 相同出入参类名,生成全限定类名 generateO2O 同类名出现问题

在此推荐其他一个我常用插件:generateAllSetter,搭配食用更佳

4、如何下载

打开idea plugins,切market place 搜索:Simple Object Copy

试用30天,支付宝、微信、PayPal都可以付款。 6元(人民币)每年,当然学生、教育机构、公益免费。

官方会邮件让你注册jb账号,给账号开通权限,你可以在官网找到自己的激活码,然后再idea 不登录用。也可以在idea 登录jb账号在线试用。

这可能是你的第一个付费插件。多谢支持,哈哈!

如果你没钱的话,也可邮件我。我找找有没有免费方式。

下班早一半

通过插件的使用

1、可以节省一个个字段的设置的开发时间

2、避免了漏字段设置,ps:前端同学总是来问为啥字段总是null

3、而且通过出入参的设计思想去开发,规范了代码,在有特殊请求转化的时候也比较方便。

Simple Object Copy,一款idea插件帮你优雅转化DTO、VO、BO、PO、DO相关推荐

  1. 一款IDEA插件神器,帮你一键转换DTO、VO、BO、PO、DO

    今日推荐 推荐一个 Java 接口快速开发框架干掉Random:这个类已经成为获取随机数的王者Docker + Intellij IDEA,提升 10 倍生产力!笑出腹肌的注释,都是被代码耽误的诗人! ...

  2. B站声音太小怎么办,一款插件帮你解决

    B站声音太小怎么办,一款插件帮你解决! 1)原由 1.博主经常在B站观看学习视频,对于B站声音太小头疼已久. (内心吐槽:"这什么破网站啊,声音那么小,还调不大,隔壁腾讯视频PC客户端音量能 ...

  3. 7 款优秀 Vim 插件帮你打造完美 IDE!

    公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 集成开发环境(IDE,Integrated Development Envi ...

  4. 5款Chrome插件,第1款绝对良心!

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 作者:Jackpop 来源:平凡而诗意 浏览器是工作和生活中接触最多的工具之一,顺手.好用的浏览器能够极大的提 ...

  5. 5 款 Chrome 插件,第 1 款绝对良心!

    公众号关注 "GitHubPorn" 设为 "星标",发现更多开发者工具! 浏览器是工作和生活中接触最多的工具之一,顺手.好用的浏览器能够极大的提高工作和学习效 ...

  6. chrome python插件_5款Chrome插件,第1款绝对良心!

    浏览器是工作和生活中接触最多的工具之一,顺手.好用的浏览器能够极大的提高工作和学习效率. 而在浏览器中占据较重地位的就是浏览器插件,我一向认为浏览器插件是一类值得推荐和使用的工具. 它具有很多PC端软 ...

  7. 9款Firefox插件提高设计开发效率

    绝大多数站长在平时的网页设计与优化过程中,都喜欢直接编写或修改代码,比如在Dreamweaver里逐个去写HTML标签或样式.但无论你对代码有多么熟悉,我还是会推荐你使用工具来简化工作,提高效率.这些 ...

  8. 有大佬通过研发这款Chrome插件的使用教程,赚了上百万! 网友:互联网的钱太好赚了~...

    最近,有同学告诉我说,D哥我发现有大佬开发 Chrome 商店里的一款爬虫教程,竟然卖了几千份,每份售价299,为啥有这么多人买呢? 我的原话是,别人的目标群体不是你(程序员),而是不会写代码的人,所 ...

  9. 用好这 42 款 Chrome 插件,每年轻松省出一个年假(附下载)

    来源:码农有道 本文约3700字,建议阅读8分钟. 为了更好地使用谷歌浏览器,最近小编整理了一些常用的谷歌插件,分享给大家. 前言 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少 ...

最新文章

  1. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程
  2. Shell中的循环语句for、while、until实例讲解
  3. C++基础14-类和对象之多继承与虚继承
  4. 【bzoj】 1412: [ZJOI2009]狼和羊的故事
  5. 如何在Kaggle 首战中进入前 10%
  6. EJB3.0框架实例----区分有状态bean和无状态bean
  7. 网络中的哪些事儿(四)之路由器中的有趣Ping实验
  8. 关于滚动相关的属性【转】
  9. php 显示探针_php 探针
  10. 基于eclipse的android项目实战—博学谷(一)欢迎界面
  11. 六种复杂控制系统简述:串级、分程、比值、前馈、选择性和三冲量控制
  12. base64、File、Blob、ArrayBuffer互转
  13. ubuntu ffmpeg 录制系统音频
  14. Android 发送短信自定义手机号自定义短信内容
  15. EXECL日期相减计算工龄
  16. 数学形态学之腐蚀算法
  17. java精尽面试题MySQL面试高频一百问(工程师方向)
  18. 教你用代码实现一个网页老虎机游戏
  19. 途客圈见面会-要点总结
  20. 全球与中国纳米压印光刻系统市场发展调研及投资价值报告2022-2028年版

热门文章

  1. exam_UNIX and relational database(0)
  2. 2020年终总结 - 灾难之年,砥砺前行
  3. 卷积核、特征图可视化
  4. 论开发能力提高之道-御剑飞升的实现
  5. react实现手写签名(带实操图)
  6. 苹果M1芯片兼容mysql吗_Apple M1芯片电脑 软件兼容情况
  7. Java 天气预报WebService
  8. Android培训班 1
  9. 【译+评】VisionMobile:Nokia+Microsoft:两个残破商务模式的故事
  10. 使用 Turbine 聚合监控