范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

一款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

跌下神坛的柳传志和联想!还有人记得倪柳之争那个倪光南吗?倪光南和柳传志是一段剪不断理还乱的孽缘。柳传志是大名鼎鼎的联想创始人,他通过自己的努力一手把联想打造成世界五百强企业,成为了全球25位商界最有影响力的领袖之一。柳传志一生战功显赫,为什么有些工程行业资料员和造价员的工资,高于现场技术管理人员?这个嘛,我是做资料的,我倒是没感觉比现场高,要么跟现场工资一样,要么比现场工资低点。不过也有比现场高的,那就是多接活,例如我老公也是资料员,现场的话一般只负责一个工程,最多两个工程通信工程师是做什么的?在哪些单位上班的?感谢邀请。通信工程师主要从事通信信息专业方面的研究设计制造运营以及企业事业机关部门和国防工业中从事开发应用通信技术与设备管理工作。在通信信息行业中是主要的专业人才和技术骨干首选,但外媒在控制关键技术前提下日政府或支持西部数据与铠侠合并据路透社网站近日报道,两位了解行业监管机构内部讨论情况的消息人士称,日本经济产业省准备支持美国西部数据公司与日本内存芯片制造商铠侠的合并,前提是尖端技术的控制权留在日本。报道认为,我国IPv6高速公路全面建成中国青年报客户端讯(中青报中青网记者张均斌)我国IPv6高速公路已全面建成,4G5G和固定宽带网络IPv6(互联网协议第6版)升级改造也全面完成。近日,在2021中国IPv6创新发MediaTek发布移动端光线追踪SDK,携手产业伙伴推动游戏体验升级2021年10月14日,MediaTek近日推出基于Vulkan扩展的移动端光线追踪SDK解决方案,并与Arm和腾讯游戏共同实现了移动端实时光线追踪技术的首次演示,为移动终端的光线移动互联网时代的手机商城系统和PC商城到底哪个更有优势?时代的进步使得人们的消费行为和消费观念产生了极大的改变,前几年还将PC端的网上购物看作是一种时尚,今天却被手机商城系统消费所取代。那么,手机商城系统功能有哪些呢?具体我们来看下文的三星上架官翻机,GalaxyZFlip3直降上千元!网友又买早了10月16日消息,三星GalaxyZFlip3官翻版正式上架京东二手平台,8128GB版到手价低至6479元。官翻机(7D版)均为国行版本,支持全国联保一年,对自用的网友来说非常划2299元!5G鸿蒙OS7nm麒麟芯,现货供应,网友幸福来得太突然在此前,很多人还没有这种感觉,不过如今不少网友会开始表示华为的手机没那么容易买到了,无论是新推出的手机,还是之前发布的手机,特别是5G的华为手机,几乎是买一部少一部。而华为的选择除办宽带需要注意些什么?办理宽带需要注意哪些事项?第一,在还未办理宽带之前,要根据自己的实际需求以及综合资费消费合理的进行宽带选择,如果对宽带网络质量要求一般,可以选择了解中国移动网络,相比较中国电信以及不懂就问,CD的和数播谁更好?感觉现在高品质录音应该是都是数字录音,而且应该是HIRESDSD等高码率母带级别(远高于CD1440k的码率)因而应该先于CD,而且在高级音频设备上,DSD(一首五六分钟的音乐有时
三星GalaxyA53跑分曝光确认搭载Exynos1200SoCIT之家12月15日消息,三星GalaxyA53手机作为A52型号的迭代款,预计将于近期正式发布。根据此前爆料,该手机将采用120HzAMOLED屏幕,配备64MP主摄。据外媒Sa物流企业如何搭乘电商发展快车近日,联邦快递发布电子商务大趋势概览白皮书,重点介绍了在中国这个全球最大的电子商务市场中最重要的七个数字化大趋势,包括多元购物体验重塑消费业态智慧城市和智能家居互联消费者拓展市场边千万不要在互联网上和别人吵架大家好我是卢妹近年来互联网普及率攀升截至2021年6月底中国网民规模已经突破十亿这么多人同时上网冲浪难免会在一些事情的看法上产生分歧脾气温和的朋友们或许不爱在互联网上和人对线只需要世界上的第一个Internet商务标准介绍1999年12月14日,在美国加州旧金山的St。Francis饭店,公布了世界上第一个Internet商务标准(TheStandardforInternetCommerce,Ver不是20年骨灰级老网民,你可能不知道的互联网记忆这家伙比我的年龄还大,相信不少第一批接触计算机使用的就是它吧,是一代人经典的回忆。从1981年MSDOS1。0直到1995年MSDOS6。22,是微软时代崛起的时期印记!但我最开始Pixelworks逐点半导体视觉显示技术赋能OPPO首款可折叠手机FindN出色的视觉处理方案为创新的屏幕体验保驾护航上海2021年12月15日美通社领先的创新视频和显示处理解决方案提供商Pixelworks,Inc。(纳斯达克股票代码PXLW)逐点半导体华为新款笔记本将支持超声波操控,会给笔记本行业带来什么改变?感慨,终于有人做了,十年前我就在想笔记本为啥就不能有这功能,相信很多人用过PPT激光翻页笔,上台演讲的时候会很方便,虽然不贵但是个人平时是不会准备这东西的,这就造成了使用上的不便。安卓有一些不为人知,但极其好用的APP天天使用手机,每次打开应用都有开屏广告,app内部也经常跳出广告让你误点击,你真的受得了吗?下面推荐几款能涵盖你生活方方面面的小众好用的APP,他们都有几个共同的特点小而美实用全程曝光配备双X轴线性马达iQOO9,iQOO8开始断崖下跌,神机再现曝光新一代旗舰级别iQOO9系列标准版新机有望配备双X轴线性马达,曝光新一代旗舰级别iQOO9系列标准版新机配备双扬声器和双压感传感器。曝光新一代旗舰级别iQOO9系列标准版新机屏达内科技再收退市警告函,教育中概股面临退市风险记者查沁君编辑有美股中国职业教育第一股之称的达内科技(NASDAQTEDU)在美上市的第七个年头,再次走到退市边缘。达内科技12月14日晚发布公告称,因在美存托股票(ADS)的收盘可能强过苹果和特斯拉,2022年看看这5只科技股智通财经APP获悉,纳斯达克指数今年迄今上涨21。17,苹果(AAPL。US)微软(MSFT。US)谷歌(GOOG。US)特斯拉(TSLA。US)和英伟达(NVDA。US)是今年以