前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一款 IDEA 插件帮你优雅转化 DTO、VO、BO、PO、DO

一款 IDEA 插件帮你优雅转化 DTO、VO、BO、PO、DO

作者头像
IT大咖说
发布2022-04-28 13:10:12
8390
发布2022-04-28 13:10:12
举报
文章被收录于专栏:IT大咖说IT大咖说

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

参考文档:

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

插件名称:Simple Object Copy

1. 定义方法出入参

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

需要手写的代码

一键生成后的展示

复杂对象转化展示(一键生成后的展示)

复杂对象转化源码示例:

代码语言:javascript
复制
@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 == ) {
return ;
}UserVO result = new UserVO;
result.setName(item.getName);result.setEntryDate(item.getEntryDate);result.setUserId(item.getUserId);List<RoleDTO> roleList = item.getRoleList;if (roleList == ) {result.setRoleList;} 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 == ) {
return ;
}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 == ) {
return ;
}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<RoleDTO> 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;
}

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代码补全字段,整体代码非常丑陋。

举例:

mapstruct

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

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

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

需要手写的代码:

代码语言:javascript
复制
@Mapper(componentModel = "spring",uses = {RoleVOMapper.class,RoomVOMapper.class})
publicinterfaceUserMapper{
UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
UserVO toUserVO(UserDTO userDTO);
}@Mapper(componentModel = "spring")
publicinterfaceRoleMapper{
RoleVO toRoleVO(RoleDTO roleDTO);
}@Mapper(componentModel = "spring")
publicinterfaceRoomMapper{
RoomVO toRoomVO(RoomDTO roomDTO);
}publicclassMain{
publicstaticvoidmain(String[] args) {
UserDTO user = ;UserVO userVO = UserMapper.INSTANCE.toUserVO(user);userVO.getRoomVO.setRoomName("大厅1");
userVO.getRoomVO.setBuildingName("尚德楼");
}}

BeanUtils

性能稍差。

不支持复杂对象还是要写大量代码,代码字段不清晰不易理解,别人接手难。RoomDTO中不存在的roomName、buildingName还要BeanUtils另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是。

需要手写的代码

代码语言:javascript
复制
@Data
publicclassUserVO{
private String name;
private Date entryDate;
private String userId;
private List<RoleVO> roleList;
private RoomVO room;
public static UserVO convertToUserVO(UserDTO item) {
if (item == ) {
return ;
}UserVO result = new UserVO;
BeanUtils.copyProperties(item,result);List<RoleDTO> roleList = item.getRoleList;if (roleList == ) {
result.setRoleList;} 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 == ) {
return ;
}RoomVO result = new RoomVO;
BeanUtils.copyProperties(item,result);result.setRoomName;result.setBuildingName;return result;
}public static RoleVO convertToRoleVO(RoleDTO item) {
if (item == ) {
return ;
}RoleVO result = new RoleVO;
BeanUtils.copyProperties(item,result);return result;
}}

2.性能优势

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

3.灵活性、兼容性

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

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

4. 如何下载?

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

来源:

https://www.toutiao.com/article/7082290021406868005/?log_from=6011b4d01ae7c_1650937521692

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ◆ VO (view object/value object)表示层对象
  • ◆ B0(bussines object)业务层对象
  • ◆ PO(persistent object)持久对象
  • ◆ DTO(Data Transfer Object)数据传输对象
  • ◆ DO(domain object)领域实体对象
  • ◆ 插件名称:Simple Object Copy
  • ◆ 需要手写的代码
  • ◆ 一键生成后的展示
  • ◆ 复杂对象转化展示(一键生成后的展示)
  • ◆ 复杂对象转化源码示例:
  • ◆ 1.无入侵市面上有很多类似的工具类,比较常用的有
  • ◆ mapstruct
  • ◆BeanUtils
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档