一款IDEA插件神器,帮你一键转换DTO、VO、BO、PO、DO,再见工具类!

 
 

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达33f64947fda62e5a8bba4a8675a4b739.png

关注公众号后台回复pay或mall获取实战项目资料视频

来源:juejin.cn/post/7053264631262871583

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/6952848675924082718

  • https://juejin.cn/post/6844904046097072141

  • https://zhuanlan.zhihu.com/p/264675395

2、插件如何完成转化

插件名称:Simple Object Copy

1、定义方法出入参

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

e0229662bb874f55b2dbe76a3cd59bb2.png

1a137e61500f66e5f046d6bacbcf8cd7.png

复杂对象转化展示

1525a13d9917fb48d141107ab593c581.png

代码展示:

@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.无入侵

市面上有很多类似的工具类,比较常用的有

  • Spring BeanUtils (copyProperties)

  • Cglib  BeanCopier (copyProperties)

  • Apache BeanUtils (copyProperties)

  • Apache PropertyUtils (copyProperties)

  • Dozer

  • mapstruct

  • JSON 序列化 再反序列化

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

2.性能优势

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

3.灵活性、兼容性

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

793ae8f94e93395cea0a752b3715db9e.png

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

4、如何下载

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

a4582d6ea87218c538b874c88c3fcc99.png

插件优点:

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

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

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

注意:该插件需要付费,6元(人民币)每年,当然学生、教育机构、公益免费。

 
 

精彩推荐

1.SSH客户端神器MobaXterm,用起来超级爽!我抛弃Xshell,putty和CRT了
2.Java8中一个极其强悍的新特性,很多人没用过(非常实用)
3.100多个免费常用API接口分享,调用完全不限次数,以后总用得着!
4.Java 8 中的这个接口真好用!炸了!

5.还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!

6.Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!

7.Docker 大势已去,Podman 崛起

8.为什么阿里规范需要在 @Transactional 事务注解中指定 rollbackFor?

9.新来的CTO强制规定所有接口都用 POST请求。。。

b738011a0010de42ecc5c1b544e4a691.png

点个在看少个 bug

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VOBOPO、DO、DTO是软件开发中常见的概念,用于表示不同的数据对象或数据传输对象。VO代表值对象(Value Object),BO代表业务对象(Business Object),PO代表持久化对象(Persistent Object),DO代表领域对象(Domain Object),DTO代表数据传输对象(Data Transfer Object)。 VO通常用于表示不可变的值对象,用于展示业务数据,不包含业务逻辑。\[1\]BO用于表示业务对象,包含业务逻辑和操作方法,用于处理业务规则和业务流程。\[2\]PO用于表示持久化对象,用于与数据库进行交互,包含与数据库表结构对应的属性和方法。\[2\]DO用于表示领域对象,是业务领域中的实体对象,包含业务逻辑和状态信息。\[3\]DTO用于表示数据传输对象,用于在不同层之间传输数据,通常是为了减少网络传输的数据量和提高性能而设计的。 在实际应用中,根据业务需求和系统设计,可以根据需要选择使用VOBOPO、DO、DTO。例如,对于展示业务不复杂的情况,可以直接使用DTO,而不需要使用VO。当系统需要操作数据库时,必须使用PO或Entity。在简单业务系统中,DTOBO可以合并成一个对象,但在业务扩展时需要注意拆分。\[2\] 需要注意的是,概念是给人用的,在多人协作的团队中,团队成员的概念要保持一致。根据需求的清晰度和稳定性,以及客户端的明确性,可以决定是否使用VODTO分离。如果需求清晰稳定且只有一个客户端,可以将VO退隐,使用一个DTO即可。但在设计层面,服务层的职责仍然不应与展示层耦合。如果存在多个不同的客户端或需要定制化,可以通过脚本或其他机制实现转换,让VO退隐。\[3\] 综上所述,VOBOPO、DO、DTO是用于表示不同数据对象或数据传输对象的概念,在实际应用中根据需求和系统设计进行选择和使用。 #### 引用[.reference_title] - *1* *3* [VODTOBO、DO、POPOJO、Entity的概念、区别和应用](https://blog.csdn.net/gongxifacai_believe/article/details/122638817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VODTOBOPO、DO概念梳理](https://blog.csdn.net/big1989wmf/article/details/126662508)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值