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,代码就生成好了
简单对象转化展现
@Datapublic 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; }}@Datapublic class UserDTO { private String name; private Date entryDate; private String userId; private List<RoleDTO> roleList; private RoomDTO room;}@Datapublic class RoleVO { private String roleId; private String roleName; private LocalDateTime createTime;}@Datapublic class RoleDTO { private String roleId; private String roleName; private LocalDateTime createTime;}@Datapublic class RoomVO { private String roomId; private String buildingId; private String roomName; private String buildingName;}@Datapublic 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、而且通过出入参的设计思维去开发,标准了代码,在有非凡申请转化的时候也比拟不便。