一款IDEA插件帮你优雅转化DTOVOBOPODO
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
插件名称: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 == ) {
return ;
}
UserVO result = new UserVO;
result.setName(item.getName);
result.setEntryDate(item.getEntryDate);
result.setUserId(item.getUserId);
List 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 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代码补全字段,整体代码非常丑陋。
举例:
1. mapstruct
同样的代码,,不仅要引入依赖、写如下转化mapper,还要,在对应地方调用对应api(代码入侵验证),然而Simple Object Copy 只需要一键生成。
RoomDTO中不存在的roomName、buildingName还要mapstruct另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是。
在Simple Object Copy 插件代码生成后,不存在的字段也生成了空方法,直接编译提示补充,不容易忽略
需要手写的代码:@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("尚德楼");
}
}
1. BeanUtils
性能稍差。
不支持复杂对象还是要写大量代码,代码字段不清晰不易理解,别人接手难。RoomDTO中不存在的roomName、buildingName还要BeanUtils另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是。
需要手写的代码@Data
publicclassUserVO{
private String name;
private Date entryDate;
private String userId;
private List roleList;
private RoomVO room;
public static UserVO convertToUserVO(UserDTO item) {
if (item == ) {
return ;
}
UserVO result = new UserVO;
BeanUtils.copyProperties(item,result);
List 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
来源:juejin.cn/post/7053264631262871583
ETH全网算力显著上升导致日均收益明显下降矿工好日子快到了?今年以来,以ETH挖矿为代表的显卡挖矿导致许多显卡价格暴涨,现在的显卡价格基本上是以ETH挖矿算力来衡量,一般是每MHashs大约120140元人民币。以RTX3060Ti和RTX
光让HampampampM道歉是不够的,真正重要是另一件事今天有白话粉丝让我聊聊HM事件,可以,那就聊聊。这个事件呢,我就先说一个结论它并没有看起来的那么简单。因为这个事件就目前所呈现出来的事实链条,大致就是HM抵制用新疆棉花,理由是那边
罗技G29,带你体验类真实的赛车世界相信每个男孩心里都埋着一颗关于热血的种子,记得儿时,一部四驱赛车掀起了观看狂潮,四驱比赛的世界,充盈了我们的孩提时代。但并不是所有热爱赛车的人都能梦寐以求地成为赛车手,而现在,我们
罗技G29欧卡2体验之前和大家分享的都是赛车竞速类游戏,紧张的氛围和极限的速度能释放不少压力,但紧张刺激的游戏玩多了也会产生一定的视觉疲劳,所以这次为大家带来的是一款较为舒缓的游戏欧卡2。如尘埃成为赛
2020超全游戏耳机选购指南,总有一款适合你说起外设产品,大多数人首先想起的一定是键盘鼠标,的确,一款好的鼠标和键盘能为游戏中的表现增光添彩,但是耳机也同样重要,尤其是在守望先锋吃鸡等游戏中,强大的游戏耳机显得更为重要,能够
基于APP软件拓展优势,医疗心电仪更多采用工业安卓一体机医疗作为民生一大支柱产业,是社会稳定发展的决定性因素之一。发展至今,伴随科技信息化技术改进等产业发展,正赋能医疗行业逐步向智能化信息化大数据方向转变,智慧医疗成为当前国内的主要发展
春水堂创始人蔺德刚要做娃界小米近日,春水堂在在线上举行了一场双十一前的媒体沟通会,创始人春叔蔺德刚跟媒体朋友们分享了硅胶娃娃新升级的功能,以及即将开启的双十一活动。说到硅胶娃娃,很多人觉得这是个挺羞涩的话,实际
传统企业如何才能做好数字化转型?数字化已经悄悄地走进每个人的生活中,我们的衣食住行都离不开数字的应用,也因此,企业数字化的运营,成为企业增加订单,提升效率必不可少的工具。对于传统企业来说,数字化转型是吃力的。移动
当传统纺织业遇上智能制造,会擦出什么样的火花?纺织业作为工业领域市场化程度最高的产业,在十三五以后,国内纺织工业发展速度明显放缓,进入产业发展转折期,如何突破成为纺织制造企业关注的重点。而深受国家重点扶持的智能制造到来,无疑也
打破传统游戏手机的面具,红米RedmiK40游戏版正式发布我不喜欢游戏手机的原因并不是因为强大的性能,谁会拒绝性能呢?真正不喜欢的原因还是在设计上。现在市面上的游戏手机基本都是又厚又重,甚至有些游戏手机外观就和游戏机一样,如此还将日常手机
TOI图益国风舞狮233片儿童拼图评测娃特别喜欢玩拼图,所以儿童拼图桌游我买了比较多,例如ORCHARDTOYS,JUMBO,EDUCA等等,家里囤了好多种拼图。那些牌子的拼图多是外国图样,像TOI这种这种国风拼图他们
蚂蚁上市之路近日,蚂蚁集团发布辟谣声明回应网上传言。回顾蚂蚁集团的上市之路,一开始就万众瞩目,号称史上最大IPO,金融巨无霸。股票代码688688,发行价68。8,寓意深刻的数字代表了多少人的
微信3天悄悄更新了两次!这次终于快过苹果啦最近,微信刷手支付冲上热搜指纹刷脸到现在刷手就能支付?难道这次真的要剁手了吗(钱不多,花钱方式倒很多)消息一出,网友纷纷表示以后不敢随便抬手了微信官方回应称刷手支付仅为微信内部技术
影像新标杆微单手机索尼Xperia1IIIChinaJoy实拍体验先为大家介绍今天的主角索尼旗舰微单手机Xperia1III。相比上一代产品,这一代新品在影像屏幕处理器以及系统体验上都有了全面的升级。业界首款潜望式可变长焦镜头,源自索尼微单影像技
CRM和SCRM有什么区别?在传统CRM系统中,每个客户就相当于一条记录,数据是静止的。企业与客户在系统上的互动很少,用户正在摒弃以电子邮件和电话的单向沟通,客户与客户之间除了需求的供给之外,更多需要互动和参
都是内存规范!DDR5LPDDR5GDDR5有什么区别我们在选购智能手机的时候,经常会在配置表中发现LPDDR5内存,而如果对数码比较感兴趣的话,也能知道电脑内存将迎来DDR5时代,一些显卡产品中依然采用GDDR5显存。从名称来看,这
智能车间智能工厂智能制造之间的区别你知道多少?新一代信息技术与制造业深度融合,全球制造业正在加快迈向数字化智能化时代,制造业是国民经济的主体,是立国之本兴国之器强国之基。在制造业智能化过程中,智能车间智能工厂智能制造有什么区别
湖南144个项目报名全国颠覆性技术创新大赛来源红网时刻新闻红网时刻8月24日讯(通讯员刘健记者何青)为加强颠覆性技术供给,培育颠覆性创新文化,探索颠覆性技术发现遴选培育的新机制,发现和挖掘一批颠覆性技术方向。日前,科技部印
腾讯投资雾帜智能,后者专注于将人工智能技术和现实应用场景结合新京报贝壳财经讯企查查APP显示,8月21日,上海雾帜智能科技有限公司发生工商变更,新增股东深圳市腾讯产业创投有限公司,同时公司注册资本由555。56万元人民币增加至633。61万
中国的量子技术处于世界第一,超前水平吗?量子卫星是中国第一个发射,但量子计算机和美国IBM和谷歌公司的相比,还有一定差距。量子信息技术目前的主要应用包括量子通信和量子计算两个方面,虽然潘建伟院士的工作让中国在量子通信方面
锂电池之父苹果年底前或发布AppleCar相关技术由于对锂电池技术作出了突出贡献,吉野彰成为2019年诺贝尔化学奖的获奖人之一。关于苹果造车以及对未来智能汽车的思考,吉野彰在近日的一次采访中表达了自己的看法。吉野彰他说,苹果公司要
要源码上门自取,结果人真上门了!国内企业再惹争议出品开源中国文Travis国内智能设备制造商UMIDIGI因违反GPLv2协议引发争议,并告知开发者想要源码上门自取。此事已引起国外网友热议。UMIDIGI是位于深圳的一家智能设备