DTO,VO,POJO,DAO,BO,AO的概念、区别

 1. DTO(Data Transfer Object)数据传输对象:

概念:主要应用于数据传输层,特别是在Controller层和Service层。在Controller层,DTO用于接收参数,无论是单个参数还是多个参数,都可以通过创建一个DTO对象来进行接收。

格式:xxxDTO,xxx为业务领域相关的名称。

例如:登录时需要传输一个用户名密码的数据。用户登录页面,你可能会创建一个表单,用户需要输入用户名和密码。当用户提交表单时,前端会将用户输入的数据传递给后端。在后端,Controller层会接收到一个UserDTO对象,该对象包含用户输入的用户名和密码等信息。然后,Controller层将UserDTO传递给Service层进行处理。

class LoginDTO {

    private String username;
    private String password;

    public LoginDTO() {
    }

    public LoginDTO(String username, String password) {
        this.username = username;
        this.password = password;
    }
    // 省略getter和setter方法
}

2. VO(View Object)数据传输对象:

概念:通常用于与前端交互,封装前端调用某个接口之后所需的所有数据。在前后端分离的时代,VO主要应用于表示视图层的类。在接口数据返回给前端的时候需要转成VO。

格式:xxxVO,xxx一般为网页名称。

例如:UserVO主要用于在系统的不同层之间传递用户相关的信息,它将用户的多个关键属性封装在一起,以便于统一处理和传递。

public class UserVO {

    private Long userId;
    private String username;
    private String password;
    private String email;
    private String fullName;
    private UserRoleEnum role;

    public UserVO() {

    }

    public UserVO(Long userId, String username, String password, String email, String fullName, UserRoleEnum role) {
        this.userId = userId;
        this.username = username;
        this.password = password;
        this.email = email;
        this.fullName = fullName;
        this.role = role;
    }

    // 省略getter和setter方法
}

3. POJO(Plain Old Java Object),简单老式 Java 对象:

概念:POJO 是指那些没有继承特定框架的类,不依赖于特定框架的接口或基类,也不包含任何与特定框架相关的代码逻辑。它只是一个普通的 Java 类,主要用于存储数据和提供简单的业务逻辑处理。

格式:一般与数据库的表名一一对应,当然也有数据库的表名有前缀比如说sys_user,对应在POJO类上可能为User类。

例如:POJO 类结构简单,通常只包含属性(成员变量)和对应的方法(如构造函数、getter 和 setter 方法等)。

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略getter和setter方法
}

4. DAO(Data Access Object)即数据访问对象:

概念:是一种在软件开发中用于分离数据访问逻辑与业务逻辑的设计模式。提供一种统一的、与具体数据库或其他数据源操作相关的接口,使得业务逻辑层可以通过这些接口来获取、插入、更新和删除数据,而无需关心具体的数据存储方式。

格式:xxxDAO,xxx一般为数据库表的名称。Mybayis中也可能为xxxMapper,或者xxxRepository等都是可以的。

例如:在一个简单的用户管理系统中,对于用户数据的访问,可能定义如下的接口。

public interface UserDAO {

    // 根据用户ID获取用户信息
    User getUserById(long userId);

    // 获取所有用户信息
    List<User> getAllUsers();

    // 插入新用户
    void insertUser(User user);

    // 更新用户信息
    void updateUser(User user);

    // 删除用户
    void deleteUser(long userId);
}

5.BO(business object)业务对象:

概念:业务对象(business object,BO)是企业领域用来描述业务概念的语义对象。这是一个非常宽泛的定义。主要是对业务领域中的实体、概念或流程进行抽象和封装的对象。它处于业务逻辑层,主要用于处理业务规则和业务逻辑,将业务操作和数据处理封装在一个独立的单元中,使得业务逻辑与其他层(如表示层和数据访问层)的耦合度降低。

格式:xxxBO,xxx一般为实体类的名称。

例如:假设我们有一个简单的图书馆管理系统,其中有一个 “图书借阅业务对象”,那么我们可以定义一个(BookLoanBO)。

public class BookLoanBO {
         private long loanId;
         private long bookId;
         private long memberId;
         private Date loanDate;
         private Date dueDate;

         // 计算逾期天数的方法
         public int calculateOverdueDays(Date currentDate) {
             if (currentDate.after(dueDate)) {
                 long diff = currentDate.getTime() - dueDate.getTime();
                 return (int) (diff / (1000 * 60 * 60 * 24));
             }
             return 0;
         }

         // 验证借阅是否合法的方法
         public boolean validateLoan() {
             // 这里可以添加更复杂的验证逻辑,比如检查会员是否存在、图书是否可借等
             if (bookId <= 0 || memberId <= 0) {
                 return false;
             }
             return true;
         }
        
         // 省略getter和setter方法
     }

6.BO(business object)业务对象:

概念:是在软件应用程序开发过程中,为了更好地组织和处理与特定应用功能或业务场景相关的操作、数据及逻辑而创建的对象。它将一系列相关的功能和数据封装在一起,使得这些功能在应用程序中能够以一种模块化、易于管理和调用的方式存在。

格式:xxxBO,xxx一般为实体类的名称。

例子:以电商应用中的订单管理应用对象为例。

  • 首先定义了OrderItem类来表示订单中的商品明细,包括商品 ID、名称、数量、单价等属性,并且有计算该项商品总价的方法。
  • 然后创建了OrderAO类作为订单管理应用对象,它包含了订单 ID、下单日期、客户 ID、商品列表、总价、订单状态等属性,并实现了创建订单、添加商品到订单、删除商品、更新总价、确认订单、取消订单等一系列与订单管理相关的方法。这些方法中不仅有简单的数据操作,还涉及到一些如检查库存(虽然这里只是简单模拟)、更新订单状态等业务逻辑。通过这个订单应用对象,可以方便地在电商应用程序中对订单进行各种管理操作。
// 商品项类,用于表示订单中的商品明细
class OrderItem {
    private String productId;
    private String productName;
    private int quantity;
    private double unitPrice;

    public OrderItem(String productId, String productName, int quantity, double unitPrice) {
        this.productId = productId;
        this.productName = productName;
        this.quantity = quantity;
        this.unitPrice = unitPrice;
    }

    public String getProductId() {
        return productId;
    }

    public String getProductName() {
        return productName;
    }

    public int quantity() {
        return quantity;
    }

    public double getUnitPrice() {
        return unitPrice;
    }

    // 计算该项商品的总价
    public double calculateTotalPrice() {
        return quantity * unitPrice;
    }
}

// 订单应用对象
class OrderAO {
    private String orderId;
    private Date orderDate;
    private String customerId;
    private List<OrderItem> orderItems;
    private double totalPrice;
    private String orderStatus;

    public OrderAO() {
        this.orderItems = new ArrayList<>();
        this.orderStatus = "Pending";
    }

    // 创建订单时设置订单基本信息
    public void createOrder(String orderId, Date orderDate, String customerId) {
        this.orderId = orderId;
        this.orderDate = orderDate;
        this.customerId = customerId;
    }

    // 添加商品到订单
    public void addItemToOrder(OrderItem orderItem) {
        // 检查商品库存是否充足(这里假设通过其他方法获取库存信息,暂未实现完整逻辑)
        if (isProductInStock(orderItem.getProductId(), orderItem.quantity())) {
            orderItems.add(orderItem);
            updateTotalPrice();
        } else {
            System.out.println("商品 " + orderItem.getProductName() + " 库存不足,无法添加到订单。");
        }
    }

    // 删除订单中的商品
    public void removeItemFromOrder(String productId) {
        orderItems.removeIf(item -> item.getProductId().equals(productId));
        updateTotalPrice();
    }

    // 更新订单总价
    private void updateTotalPrice() {
        totalPrice = orderItems.stream().mapToDouble(OrderItem::calculateTotalPrice).sum();
    }

    // 检查商品是否有库存(假设方法,实际需与库存管理系统交互)
    private boolean isProductInStock(String productId, int quantity) {
        // 这里简单返回true,实际要根据库存系统数据判断
        return true;
    }

    // 获取订单明细信息
    public List<OrderItem> getOrderItems() {
        return orderItems;
    }

    // 获取订单总价
    public double getTotalPrice() {
        return totalPrice;
    }

    // 获取订单状态
    public String getOrderStatus() {
        return orderStatus;
    }

    // 设置订单状态
    public void setOrderStatus(String orderStatus) {
        this.orderStatus = orderStatus;
    }

    // 确认订单
    public void confirmOrder() {
        // 这里可以添加更多确认订单的业务逻辑,如更新库存、发送确认邮件等
        // 暂时只设置订单状态为"Confirmed"
        setOrderStatus("Confirmed");
    }

    // 取消订单
    public void cancelOrder() {
        // 这里可以添加更多取消订单的业务逻辑,如恢复库存等
        // 暂时只设置订单状态为"Canceled"
        setOrderStatus("Canceled");
    }
}

总结:

DTO、VO、POJO、DAO、BO和AO在软件开发领域都有着各自重要的作用。 DTO主要用于在不同层或系统间传输数据,通过将相关数据封装成简单的对象,有效减少网络传输开销并隐藏内部细节。VO侧重于封装多个相关属性以保证数据的完整性和不可变性,常作为方法返回值或在层间传递数据。POJO是普通的Java对象,可用于存储数据和简单业务逻辑处理,不依赖特定框架,具备良好的可移植性。DAO负责分离数据访问逻辑与业务逻辑,提供统一的数据源操作接口,方便数据库的切换与维护。BO则是对业务领域的实体、概念或流程进行抽象和封装,处理复杂业务规则和逻辑,降低与其他层的耦合度。AO围绕特定应用功能或业务场景组织相关操作、数据和逻辑,以模块化形式实现特定应用功能,它们共同协作助力软件开发,提升系统的可维护性、扩展性以及数据处理的高效性等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值