Java开发专业名词分类
DO、VO、PO、DTO、DAO,POJO,JavaBean,Domain等;
POJO:
POJO(Plain Ordinary Java Object),即简单Java对象,就是一个我们最常见的普通Java对象,这个概念是被大家叫出来的,它具有一些属性,然后提供对应的getter和setter方法,如下:
public class Student_01 {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
JavaBean:
JavaBean,可序列化的POJO,sun在早期有对其规范(JavaBeans Spec),它是Java中的可重用组件,主要规范约定如下:
- JavaBean为公共类,并且具有一个空构造函数
- 所有属性为私有属性,提供getter和setter,不应该有公共属性
- 实现序列化接口:java.io.Serializable
JavaBean已经成为Java的一种规范,也是Java社区的共同语言,许多工具框架也是遵循JavaBean的规范的,例如,Spring的BeanUtils,一些Json工具都是基于JavaBean的规范来实现的,这些都是基于约定,所以也有人把JavaBean叫为可以持久化的POJO。
DO:
DO(Domain Object),领域对象,也就是ORM框架中对应数据库的对象,业务实体,例如,对现实世界中的用户建模,抽象出来的DO可以叫为UserDO,通常情况下它用于与数据库的数据交互,通常也是一个JavaBean。
PO:
PO(Persistent Object),持久化对象,主要用于持久化层,与数据库对应的java Bean (model,entity,bean等叫法都是可以的),里面除了私有的成员变量之外,就只有其对应的set/get方法,通常也是ORM框架中的实体对象,例如,使用JPA时候的Entity与数据库表做映射,通常是一个JavaBean。
而且其变量一般跟数据库表中的列几乎(除了名字)一样。
DTO:
DTO(Data Transfer Object),数据传输对象,顾名思义就是用于传输数据的对象,通常用于处于不同架构层次或者不同子系统之间的数据传递,或者用于外部接口参数传递,以便提供不同粒度不同信息的数据,以免造成困惑干扰,通常也是一个JavaBean。
VO:
VO(Value Object),就是用于保存数据的对象;在提供给页面使用的时候,也有人解释为View Object,就是对应页面展示数据的对象。
除了可以跟PO完全一样的变量,set/get方法之外,还可以有其他的变量,但是不用其跟数据库打交道,可以把该对象当做无状态的对象。如下:
public class QueryVo {
private String custName;
private String custSource;
private String custIndustory;
private String custLevel;
private Integer page = 1;
private Integer start;
private Integer size = 10;
public Integer getStart() {
return start;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustIndustory() {
return custIndustory;
}
public void setCustIndustory(String custIndustory) {
this.custIndustory = custIndustory;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
}
DAO:
DAO(Data Access Object),数据访问对象,与数据库做交互的对象,提供不同的接口访问数据库来实现对数据库的操作,而接口使用的数据交互通常就是PO或者DO,通过它可以使用面向对象的方式来与数据库交互。
总结:
- DO、PO、VO、DTO等其实都是一个JavaBean,只是应用的范围不同,表示的意义不同,而这些不同是Java这么多年来形成的一种约定,这种习惯形成Java程序员之间一种共识
- DO和PO大部分时间是一样的,不过PO更倾向于有状态的对象,例如,使用Hibernate的时候,通过DAO操作过的对象会被框架所持有,如果一旦对其操作,在Session关闭的时候会写回数据库,这个时候使用PO就要非常小心,特别是与其他业务层交互的时候,最好转成DTO或者VO提供数据,不能把持久化对象暴露出去,不然可能会导致数据被修改
- 在使用这类对象的时候,我们还是要明白其意义,然后在合适的场景使用,毕竟这是Java形成的通用语言,想要读懂他人代码就要理解,想要他人能读懂自己的代码就要遵循
- PO与VO为什么要分开使用:
4.1. 首先PO是持久化类,其属性的改变很有可能直接导致数据库中的数据变化,而不知道原因(为什么我的数据库中的数据变化了?)。引入了VO之后可以很好的解决类似的问题,甚至会很好的帮你解决页面(JSP,freemarker,asp,aspx)和控制层的直接便利的交互,而不用担心其各种属性的变化会不会导致数据库中数据的变化,这对于使用hibernate之后控制其操作数据时出现的持久化、瞬态、脱管都是有很大好处的。
4.2. 使用VO之后要注意其活动范围要控制在service层、controller层、展现层中,而不要进入dao层甚至是数据库(一般也不可能影响到数据库),同样的PO也只能出现在dao层和数据库(数据库直接和PO交互),而不能够出现在service层、controller层、展现层中。
所以,PO和VO都会出现在service层,而且也会在service中进行适当转换。