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围绕特定应用功能或业务场景组织相关操作、数据和逻辑,以模块化形式实现特定应用功能,它们共同协作助力软件开发,提升系统的可维护性、扩展性以及数据处理的高效性等。