在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(对象关系映射)中与数据表的一条记录相匹配,自身属性与数据表字段一一对应。好处是可以把一条记录作为一个对象处理,方便的转为其它对象。
//示例代码
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在商业逻辑层和表示层。
值对象不需要维护生命周期中状态的一致性,这个对象被创建后只能被引用,当没有引用时交给垃圾回收自动处理。
值对象应该与实体一起区分:
//示例代码
public class ValueObject{
}
理解了VO的意思,也就明白了,DTO也是一种值对象。
VO( View Object):另一层含义是显示层对象,通常是Web向模板渲染引擎层传输的对象。
BO(business object 业务对象)
业务对象,就是把业务逻辑封装为一个对象(注意是逻辑,业务逻辑),这个对象可以包括一个或多个其它的对象。通过调用Dao方法,结合PO或VO进行业务操作。
业务对象可被抽象为“实体(Entity)”或“值对象(VO)”。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。