DO、DTO、BO、VO、PO、DAO、POJO

发布于:2024-04-03 ⋅ 阅读:(142) ⋅ 点赞:(0)

目录

一、DO、DTO、BO、VO、PO、DAO、POJO的概念

二、DO、DTO、BO、VO具体如何使用?代码详细说明

三、有没有其他类似的概念,比如POJO(Plain Old Java Object)?它们有什么区别?

四、在实际项目中,何时应该使用DO、BO、DTO和VO?

五、你能举例说明一个具体的场景,需要用到DO、BO、DTO和VO吗?

六、如何在Java中实现DO、BO、DTO和VO?

七、你是否知道Spring框架中的Model对象,它是DO、BO、DTO还是VO?

八、你了解Spring MVC的基本工作流程吗?★★★


请阅读:关于PO、BO、VO、DTO、DAO、POJO等概念的理解_二木成林-华为云开发者联盟 (csdn.net)

一、DO、DTO、BO、VO、PO、DAO、POJO的概念

DO(Domain Object)领域对象,它代表的是业务领域的核心概念,通常包含了业务逻辑。在不同的上下文中,DO的含义可能会有所不同:

  1. 阿里巴巴开发手册中定义的DO类似于PO,与数据库表结构一一对应。
  2. 领域驱动设计(DDD)中,DO是业务对象,包含了业务规则和操作。

DTO(Data Transfer Object)数据传输对象,主要用于不同系统或者系统内部模块间的数据交换,可能不包含业务逻辑,仅保留必要的数据字段。

BO(Business Object)业务对象,它封装了一定的业务逻辑,可能涉及对DAO的调用,用于实现对数据的处理和服务。

VO(Value Object)值对象,主要用于表示页面展示的数据,往往是从其他对象(如BO或DTO)中提取出前端需要的部分,减少了数据传输量。

PO(Persistant Object)持久对象,直接映射数据库表的记录,常用于ORM框架,一般只有getter和setter方法,不含业务逻辑。

DAO(Data Access Object)数据访问对象,是对数据库操作的封装,提供了 CURD(Create, Read, Update, Delete)等基础方法,隔离了业务逻辑层与数据库访问层。

POJO(Plain Ordinary Java Object)简单无规则Java对象,它只是一个普通的Java类,遵循JavaBean规范,不附加特定框架或设计模式的要求,常作为数据容器使用。

-----------------------------------------------------------------------------

DO(Data Object):通常与数据库表结构对应,用于DAO层向上层传输数据源对象。

DTO(Data Transfer Object):数据传输对象,用于不同层之间,如Service到Controller,或是跨服务通信的数据载体。

BO(Business Object):业务对象,封装了具体的业务逻辑,主要在Service层内使用。

VO(View Object):视图对象,用于表示前端展示所需的数据,通常在Controller返回给视图时转换成VO格式。

这些对象的主要区别在于它们的用途和范围:

  • DO关注数据持久化,直接来源于或保存到数据库。
  • DTO关注数据传输,用于跨层或跨系统通信,可能包含多个来源的数据。
  • BO关注业务逻辑,是一个业务过程中的核心对象。
  • VO关注视图呈现,仅包含前端展示需要的信息。

-----------------------------------------------------------------------------

二、DO、DTO、BO、VO具体如何使用?代码详细说明

由于编写完整的代码示例在这里不太实际,我会提供一个概念性的概述以及它们在Java Spring框架中的简单应用场景。

假设我们有一个简单的User实体类,它与数据库中的用户表相对应(DO):

public class UserDO {
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

现在,当我们从数据库中获取用户信息并将其传递给Service层时,可能会创建一个UserBO(BO),在此基础上添加业务逻辑:

public class UserBO {
    private UserDO userDO;
    
    public UserBO(UserDO user) {
        this.userDO = user;
    }

    public boolean isEmailVerified() {
        return !userDO.getEmail().contains("unverified");
    }

    // getters for user properties (if needed)
}

然后,在Service层向Controller层传递数据时,我们会创建一个UserDTO(DTO),因为可能不需要所有原始字段,并且可能需要进行一些转换:

public class UserDTO {
    private Long id;
    private String displayName;
    
    public UserDTO(UserBO userBO) {
        this.id = userBO.getUserDO().getId();
        this.displayName = userBO.getUserDO().getName();
    }
}

最后,当Controller将数据发送到视图(例如JSP页面)时,可以创建一个UserVO(VO)来适应视图的需求:

public class UserVO {
    private String usernameLabel;
    private String emailStatus;

    public UserVO(UserDTO userDTO) {
        this.usernameLabel = "Username: " + userDTO.getDisplayName();
        this.emailStatus = userDTO.isEmailVerified() ? "Verified" : "Unverified";
    }
}

应用这些对象的一个例子可能是:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public UserDTO getUserDetails(Long userId) {
        UserDO userDO = userRepository.findById(userId).orElse(null);
        UserBO userBO = new UserBO(userDO);
        UserDTO userDTO = new UserDTO(userBO);
        return userDTO;
    }
}

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<UserVO> getUser(@PathVariable Long id) {
        UserDTO userDTO = userService.getUserDetails(id);
        UserVO userVO = new UserVO(userDTO);
        return ResponseEntity.ok(userVO);
    }
}

-----------------------------------------------------------------------------

三、有没有其他类似的概念,比如POJO(Plain Old Java Object)?它们有什么区别?

POJO(Plain Old Java Object)是一个没有特定限制或约束的普通Java对象。它通常用于存储和传输数据,而不包含任何特殊的框架API或者继承自特定的父类。POJO的主要特点就是它的简单性,它可以是任何不涉及特定技术或框架的Java类。

与上述提到的DO、DTO、BO和VO相比,主要区别在于它们的用途和上下文:

  • DO(Data Object)通常直接映射到数据库表,用于持久化操作。
  • DTO(Data Transfer Object)用于在系统组件之间传输数据,避免暴露内部实现细节。
  • BO(Business Object)代表业务逻辑的抽象,它封装了业务规则和操作。
  • VO(Value Object)主要用于表示视图的数据显示,往往与UI展示有关。

-----------------------------------------------------------------------------

四、在实际项目中,何时应该使用DO、BO、DTO和VO?

在实际项目中,根据不同的需求和场景,可以适当地使用DO、BO、DTO和VO:

  1. 当需要与数据库交互时,创建DO(Data Object)来映射数据库表,方便ORM(Object-Relational Mapping)框架如Hibernate进行数据持久化操作。

  2. 对于业务逻辑处理,定义BO(Business Object),它封装了与业务相关的操作和状态,例如订单服务可能有一个OrderBO,包含了创建订单、支付订单等方法。

  3. 在不同服务间通信或前端展示时,使用DTO(Data Transfer Object)。这是因为直接暴露DO可能会泄露过多的底层结构,而DTO只包含必要的属性,减少了不必要的复杂性。例如,在微服务架构中,服务A调用服务B,服务B会将数据转换为DTO返回给服务A。

  4. 对于视图展示,创建VO(View Object),它根据页面的需求定制数据结构,往往包含一些组合字段或处理过的数据。这样可以避免在视图层做复杂的业务逻辑计算。

-----------------------------------------------------------------------------

五、你能举例说明一个具体的场景,需要用到DO、BO、DTO和VO吗?

假设我们正在开发一个电商系统,这个系统有四个主要部分:数据库、业务逻辑、API接口和服务端渲染的前端页面。

  1. 数据库:我们需要存储商品信息,因此创建一个ProductDO类,其属性与数据库表字段一一对应,如idnamedescriptionprice等。

  2. 业务逻辑:当用户下单时,我们创建一个OrderBO,它不仅包含ProductDO的基本信息,还包含订单的状态(待付款、已发货等)、用户信息、收货地址等。OrderBO提供了方法来执行业务操作,如计算折扣、更新订单状态等。

  3. API接口:当用户通过API请求订单详情时,我们不需要暴露所有的内部业务信息,而是将OrderBO的数据转化为OrderDTO,只包含必要信息,如商品名称、价格、数量、总价等。这样可以保护系统的安全性和设计的清晰性。

  4. 前端页面:最后,服务器根据OrderDTO创建一个OrderVO,可能需要进一步调整数据结构以适应前端页面的展示,比如合并某些信息,或者添加一些计算后的属性,如优惠后的实际支付金额。

-----------------------------------------------------------------------------

六、如何在Java中实现DO、BO、DTO和VO?

在Java中实现DO、BO、DTO和VO主要是通过创建对应的Java类并定义其属性和行为。下面以一个简单的例子来说明:

假设我们有一个用户注册的场景,涉及到数据库、业务逻辑和API接口。

  1. Data Object (DO):
public class UserDO {
    private String id;
    private String username;
    private String password;
    private String email;

    // getters and setters
}
  1. Business Object (BO):
public class UserBO extends UserDO {
    private boolean isEmailVerified;

    public void verifyEmail() {
        // 更新isEmailVerified逻辑
    }

    // additional business logic methods

    // getters and setters for isEmailVerified
}
  1. Data Transfer Object (DTO):
public class UserDTO {
    private String username;
    private String email;

    // no sensitive data like passwords

    // getters and setters
}
  1. View Object (VO):
public class UserVO {
    private String displayName;
    private String formattedEmail;

    public UserVO(UserDTO userDto) {
        this.displayName = userDto.getUsername();
        this.formattedEmail = "mailto:" + userDto.getEmail();
    }

    // getters only, no setters as it's a read-only object for presentation
}

在这个例子中,UserDO直接映射数据库表;UserBO包含了业务逻辑,例如邮件验证;UserDTO用于API响应,不包含敏感信息;UserVO用于前端显示,格式化了邮箱地址。

-----------------------------------------------------------------------------

七、你是否知道Spring框架中的Model对象,它是DO、BO、DTO还是VO?

在Spring MVC框架中,Model对象是一个接口,通常用来存储视图相关的数据。它不是DO、BO、DTO或VO的一种,但可以包含这些类型的对象。Model对象通常用于控制器方法的参数,以便将数据传递给视图层。当你从控制器方法返回一个模型视图名称时,Spring会自动将Model中包含的所有对象暴露给视图。

例如:

@Controller
public class MyController {

    @GetMapping("/users")
    public String getUsers(Model model) {
        List<UserDTO> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "users";
    }
}

在这个例子中,UserDTO是DTO,而Model是用来在控制器和视图之间传递UserDTO的对象。

-----------------------------------------------------------------------------

八、你了解Spring MVC的基本工作流程吗?★★★

当然,Spring MVC的工作流程大致如下:

  1. 用户发送请求到达前端控制器(DispatcherServlet)。
  2. DispatcherServlet解析请求,并找到对应的处理器映射器(HandlerMapping)。
  3. 处理器映射器找到处理该请求的处理器(一般为一个Controller类的方法)。
  4. DispatcherServlet调用处理器适配器(HandlerAdapter)来执行处理器。
  5. 处理器执行完成后,返回一个ModelAndView对象,其中包含视图名和模型数据。
  6. 视图解析器(ViewResolver)根据ModelAndView中的视图名解析出具体的视图对象。
  7. DispatcherServlet将模型数据传给视图对象,视图开始渲染。
  8. 渲染完成后的结果被返回给客户端。

-----------------------------------------------------------------------------


网站公告

今日签到

点亮在社区的每一天
去签到