美文网首页
PO、VO、DO...还在傻傻分不清楚吗?

PO、VO、DO...还在傻傻分不清楚吗?

作者: Coding测试 | 来源:发表于2020-10-17 21:52 被阅读0次

​JAVA是面向对象编程,原本一个对象就解决了所有问题,但是用的地方多了一个对象就不够用了,就有了衍生版本。PO、VO、DO……应运而生,但是没看到一个官方的权威性的定义,各个版本也有不同的说法,这里谈谈我的个人理解。我们先来看看他们的定义:

  • VO(View Object):视图对象,用于展示层,主要用于页面展示以及将页面的数据传送给控制器。

  • DO(Domain Object/Data Object):一种说法是Domain Object,领域对象,是对现实生活中的抽象对象,另一种说法是Data Object,也就是数据对象,他的内容和数据库表结构一致,个人比较赞成这种说法。

  • DTO(Data Transfer Object):数据传输对象,主要用于Service和Manager层向外传输的对象。

  • PO(Persistent Object):持久化对象,它和数据库表结构一致。

  • BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。

  • POJO(Plain Ordinary Java Object):一般Java对象,DO、VO、DTO等的统称。

  • Query:数据查找对象,各层接收上层的查询对象。

  • Entity:实体类,基本和数据库表结构一致。

  • Domain:与POJO一样,一种对象的统称。

这么多对象,我们该怎么用呢?是不是所有对象都要用上呢?
编码风格也是分派系的,不同派系有自己的特点,也不需要用到所有的对象。业界比较良心的阿里派系,《阿里巴巴 Java 开发手册》中就只有DO、DTO、BO、VO和Query五种对象。如果你够豪横,就用一个对象处理所有问题也是完全可以的,但是这样做,代码的可维护性就太差了,而且可能会造成数据安全问题和性能问题。例如我们有对象Book和User两个对象

/**
 * @Description 书籍
 * @Author Rogear
 * @Date 2020/9/11 10:58
 */
public class Book {
    /**
     * 自增id
     */
    private Long id;
    /**
     * 书籍名称
     */
    private String name;
    /**
     * 售价
     */
    private Double price;
    /**
     * 作者
     */
    private String Author;
    /**
     * 发布时间
     */
    private Date publishTime;
        ...(省略get和set方法)
}
/**
 * @Description 用户
 * @Author Rogear
 * @Date 2020/9/11 11:01
 */
public class User {
    /**
     * 自增id
     */
    private Long id;
    /**
     * 用户姓名
     */
    private String name;
    /**
     * 密码
     */
    private String password;
    /**
     * 性别
     */
    private String gender;
    /**
     * 书籍
     */
    private List<Book> bookList;
    ...(省略get和set方法)}

如果界面上需要展示用户信息,那我们需要处理敏感信息,例如将密码隐藏起来或者直接不传给视图层。如果我们新建一个UserVO,里面直接不包含敏感信息,那是不是更方便呢?

再则,如果我们要对用户信息做CRUD操作的时候,传输过程中带有了非用户基本信息,例如上面的bookList。一方面这个数据对当前业务没有用,无意义,另一方面这样会让对象变大,字节更多,网络传输的时候会更加慢影响系统性能。如果我们在各业务里面造一个只包含用户基本信息的对象,那就比较完美了。

由于种种原因的驱使,我们需要使用不同对象,那什么情况下用什么对象呢?

首先抽象概念的对象,POJO、Domain、Entity三个对象概念过于抽象笼统,见名不知意,建议代码中就不要使用了,我们应该用一些更加具体化的对象。

VO直接和视图层进行交互,无论是控制器向界面展示数据,还是界面提交表单等都用VO。

DO/PO直接和数据库进行交互,写数据库和读数据库都用他。

DTO用于数据传输,可以用在Service层和Manager层。

Query用于查询对象封装,比如我们要去查询莎士比亚写的《哈姆雷特》,我们可以造一个BookQuery去传参数

微信公众号:Coding测试

相关文章

网友评论

      本文标题:PO、VO、DO...还在傻傻分不清楚吗?

      本文链接:https://www.haomeiwen.com/subject/kgeluktx.html