彻底搞懂 bean,pojo(DTO、VO、BO、PO)与Entity的区别

102 阅读6分钟

1、MVC架构

在讲解之前先要了解MVC三层架构。 C:控制层,M:数据层,V:表现层

image.png

MVC三层架构流程:

  1. 接受用户的请求。接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理将请求转发给对应的Model数据层。
  2. 数据层处理完毕之后将结果返回给Controller.
  3. Controller根据处理结果,找到对应的View表现层进行数据渲染。View表现层将视图返回给用户。

前后端分离的情况下,后端三层架构往往会分为Controller控制层,Service服务层,Repository数据访问层。
 1、Controller控制层:用于接收前端请求和返回响应。
 2、Service服务层:主要用于一些业务逻辑的处理。
   2.1:封装业务逻辑。
   2.2:协调数据访问:Service层可以调用多个DAO层,对数据访问进行协调,确保数据的完 整性和一致性。
   2.3:异常处理:捕获和处理异常情况,提供友好的错误信息给上层处理。
 3、Repository数据访问层:对数据进行增删改查,其中增、删、改。对数据库数据进行操作。


2、bean pojo entity

了解完三层架构及其数据传输流程后。开始讲解bean,pojo,Entity三者区别。

bean,pojo, entity三者主要是为了更好封装数据以及数据流动,区分各个层级,做到层级分明,各司其职。

image.png

bean:Javabean

定义:
JavaBean 是一种JAVA语言写成的可重用组件。它的方法命名,构造及行为必须符合特定的约定:

  • 这个类必须有一个公共的缺省构造函数。
  • 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
  • 这个类应是可序列化的。Serialization接口。
  • 因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。

JavaBean的任务就是: “Write once, run anywhere, reuse everywhere”,即“一次性编写,任何地方执行,任何地方重用”。

JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。

使用:

/**
 * javaBean
 */
public class Users implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private Integer age;

    public Users() {
    }

    public Users(Long id,Integer age){
        this.id = id;
        if (verifyAge(age)) this.age = age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    //可以写相对应的业务逻辑
    private boolean verifyAge(Integer age){
        return age > 18 ? true : false;
    }
}

pojo:Plain Ordinary Java Object:简单的JavaBean对象

定义:

  1. 实际上是简单的Java对象,实际就是普通JavaBean。
  2. 不实现任何接口和不继承任何类。
  3. 在编写POJO类时,通常需要为该类提供无参构造函数,以便在创建对象时进行初始化操作。
  4. 只能包含getter方法和setter方法,以及Object重写方法(toString,equals,hashCode,clone),不包含业务逻辑。

内容:
Pojo包含 DTO、VO、BO、PO、DO
使用:


/**
 * pojo
 */
public class Users {

    private String username;

    private String password;

    public Users() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}

2.1:DTO

定义

  1. DTO是pojo类中的一种,主要是用于与封装程序传递到后端的数据,以及封装返回的数据给程序。
  2. DTO = Data Transfer Object = 数据传输对象。

Dto作用:

  • 能提高数据传输的速度(减少了传输字段)
  • 能隐藏后端表结构

例如:数据库字段有:username,password,Id_number,gender,address。 程序只需要 username,gender,address


/**
 * pojo:DTO
 */
public class UsersDto {

    private String username;

    private String gender;
    
    private String address;

    public UsersDto() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

2.2:VO:用于封装后端返回给前端的数据

定义

  1. VO是pojo类中的一种,封装后端返回给前端的数据。
  2. VO = value object。
  3. VO对象在控制层与视图层进行传输交换。

作用:

  1. 前端展示的数据,在接口数据返回给前端的时候需要转成VO
  2. 个人理解使用场景,接口层服务中,将DTO转成VO,返回给前台

2.3:BO:用于后端Service服务端数据处理逻辑

business object业务对象,即Service层 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 比如一个用户,有基本信息、工作经历、 人员关系等等。 我们可以把基本信息对应一个PO,工作经历对应一个PO, 人员关系对应一个PO。 建立一个对应简历的BO对象处理简历,每个BO包含这些PO。 这样处理业务逻辑时,我们就可以针对BO去处理。

一个BO对象可以包含多个PO对象

/**
 * pojo:BO
 */
public class UsersBO {

    private String username;

    private String gender;

    //用户地址PO对象
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
    public UsersBO() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

2.4:PO:Persistent Object持久化对象

定义:

  1. 出现位置为数据库数据,用来存储数据库提取的数据
  2. 只存储数据,不包含数据操作
  3. 个人理解使用场景,在数据库层中,获取的数据库数据存储到PO中,然后转为BO返回到服务层中,服务层通过BO对象处理。

作用:
PO对象与Entity,DAO对象作用相同,跟数据库导入记录数据一一对应的映射关系。 一个PO对象就是一条数据库对应的数据。

image.png


/**
 * pojo:Po
 */
public class UsersPo {

    private Long id;

    private String username;

    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Entity:

定义
实体bean,一般是用于ORM对象关系映射,一个实体映射成一张表,一般无业务逻辑代码。
负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个EntityBean对象相当于创建一条记录,删除一个EntityBean对象会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。 作用: 与PO对象相同,都是用于与数据库字段一一对应。例子与PO相同

DAO:用于处理数据访问层的,作用与PO相同。