概念POJO、DTO、DAO、PO、BO、VO、ENTITY详解

在java开发过程中,新手总是被DAO、PO、BO、VO等等概念弄得晕头转向。
下面我查找了很多资料,总结如下:

POJO(Plain Ordinary Java Object 简单Java对象)
实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。它包括PO、DTO、VO、BO等。
POJO持久化-》PO
POJO传递-》 DTO
POJO在表示层-》VO

PO(persistence object 持久层对象)
通常是ORM(对象关系映射)中与数据表的一条记录相匹配,自身属性与数据表字段一一对应。好处是可以把一条记录作为一个对象处理,方便的转为其它对象。

  • 只包含getter、setter和toString方法。
  • 不包含业务逻辑与数据库的访问方法。
  • PO需要实现序列化,以备转换成DTO作为前端输出及远程调用使用。
//示例代码
public class User implements Serializable {
     
    //序列化版本
    private static final long serialiVersionUID = 1L;
	private Long id;
    private String username;
    private String password;    
    //省略getter和setter方法
}

DAO(data access object 数据访问对象)
包含对数据的访问,负责持久层的操作 。通常需要结合PO来访问数据库,主要用来封装对数据的访问。它包含业务逻辑,不与其它对象进行转化。

public interface Dao{
     
    int insert(User user);
    User selectById(long id);
}

DTO(Data Transfer Object 数据传输对象)
数据传输对象,是在应用网络层需要传输的对象。
比如,从输入来看,应用在接口接收传入对象,然后又转换成实体进行持久化。在此过程中,传输的对象就是DTO。
从输出来看,若数据表有100个字段,那么PO中就有100个属性,而界面可能只需要其中10个属性,那么查询数据库后,对象就需要由PO转化成DTO。DTO可能还需要给前端传输一些不在数据库中查到的属性,所以需要添加属性。
DTO只包含自身数据的存储,而不包含业务逻辑。DTO能避免过多无用数据传输,能隐藏后端的表结构。

//示例代码,继承实体类,从查询到的PO中添加属性返回给前端
public class UserDTO extends User {
     
    //序列化版本
    private static final long serialiVersionUID = 2L;
    //用户标识
    private String username;
    public String getUsername(){
     return username;}
    public void setUsername(String username){
     this.username= username;}
    //添加额外属性
    private HashMap<String, Object> extProperties;        
    public HashMap<String, Object> getExtProperties() {
     
        return extProperties;
    }
    public void setExtProperties(HashMap<String, Object> extProperties) {
     
        this.extProperties = extProperties;
    }
}

Entity(实体)
实体,顾名思义,实体需要给予一个唯一标识,以区分其它实体,而值对象VO不需要。
实体应该有一个生命周期,例如抽象订单有一个唯一识别号,订单有从下单创建到最后交货完成的生命周期。实体对象需要维护生命周期中状态的一致性。
例如,PO有唯一标识,与数据表的一条记录对应,所以是一个实体类。
特别注意:Entity不仅仅只有PO一种,业务对象(BO)也可能被抽象为实体。

//示例代码
public class Entity{
     
    private int id;
    int getId(){
     return id;}
}

VO(value object 值对象)
值对象,通常用于业务层之间的数据传递,仅仅包含自身的数据。
与实体的区别是,没有唯一标识。
与PO的区别是,PO只在数据层,VO在商业逻辑层和表示层。
值对象不需要维护生命周期中状态的一致性,这个对象被创建后只能被引用,当没有引用时交给垃圾回收自动处理。
值对象应该与实体一起区分:

  • 核心实体和值对象应该在领域(Domain)层
  • 定义的领域服务(Domain Service)在Service层
  • 值对象和实体的存储逻辑都应该在Repository层
//示例代码
public class ValueObject{
     
    
}

理解了VO的意思,也就明白了,DTO也是一种值对象。

VO( View Object):另一层含义是显示层对象,通常是Web向模板渲染引擎层传输的对象。

BO(business object 业务对象)
业务对象,就是把业务逻辑封装为一个对象(注意是逻辑,业务逻辑),这个对象可以包括一个或多个其它的对象。通过调用Dao方法,结合PO或VO进行业务操作。
业务对象可被抽象为“实体(Entity)”或“值对象(VO)”。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。

概念POJO、DTO、DAO、PO、BO、VO、ENTITY详解_第1张图片

  • PO通常放在名为bean、entity、model目录中。
  • DAO通常在DAO、mapper目录中。
  • BO通常在service、manager、business目录中。

你可能感兴趣的