美文网首页
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