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
- 定义方法出入参
- 光标定位办法内,应用快捷键 ALT+INSERT(WIN)、command + N(mac),或者右键鼠标抉择 Generate,弹出生成选项框后,抉择 genCopyMethod,代码就生成好了
简单对象转化展现
@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();
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<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;
}
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 代码补全字段,整体代码十分俊俏。
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、而且通过出入参的设计思维去开发,标准了代码,在有非凡申请转化的时候也比拟不便。