头图

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,代码就生成好了


复杂对象转化展示

@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

image.png

试用30天,支付宝、微信、PayPal都可以付款。 6元(人民币)每年,当然学生、教育机构、公益免费。

官方会邮件让你注册jb账号,给账号开通权限,你可以在官网找到自己的激活码,然后再idea 不登录用。也可以在idea 登录jb账号在线试用。

这可能是你的第一个付费插件。多谢支持,哈哈!

如果你没钱的话,也可邮件我。我找找有没有免费方式。

下班早一半

通过插件的使用

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

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

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


方便面
1 声望0 粉丝