DO/PO/BO/AO/E/DTO/DAO/ POJO/VO各个的用法

以下是对实体类(Entity)、数据传输对象(DTO)、领域对象(Domain Object)、持久化对象(Persistent Object)、业务对象(Business Object)、应用对象(Application Object)、数据访问对象(Data Access Object, DAO)、服务层(Service Layer)和控制器层(Controller Layer)的总体介绍。

 

  • 不同领域作用  

POJO (Plain Old Java Object)

  • 定义:POJO 是一个简单的Java对象,它不继承任何特定的类或实现任何特定的接口,除了可能实现 java.io.Serializable 接口。它通常用于表示数据,不包含业务逻辑。

  • 案例的体现

    • UserEntity 类可以看作是一个POJO,因为它主要包含数据字段和标准的构造函数、getter和setter方法。

    • UserDTO 类也是一个POJO,它用于传输数据,不包含业务逻辑。

VO (Value Object)

  • 定义:VO 是一个代表某个具体值或概念的对象,通常用于表示传输数据的结构,不涉及复杂的业务逻辑。

VO(View Object)的特点:

  • 展示逻辑:VO通常包含用于展示的逻辑,例如格式化的日期或货币值。

  • 用户界面相关:VO设计时会考虑用户界面的需求,可能包含特定于视图的属性。

  • 可读性:VO可能包含额外的描述性信息,以提高用户界面的可读性。

实体类(Entity)

  • 作用:代表数据库中的一个表,是数据模型的实现,通常与数据库表直接映射。

  • 使用场景:当需要将应用程序的数据持久化到数据库时使用。

数据传输对象(DTO)

  • 作用:用于在应用程序的不同层之间传输数据,特别是当需要将数据从服务层传输到表示层或客户端时。

  • 使用场景:进行数据传输,尤其是在远程调用或不同服务间的数据交换时。

领域对象(Domain Object)

  • 作用:代表业务领域的一个实体或概念,通常包含业务逻辑和业务状态。

  • 使用场景:在业务逻辑层处理复杂的业务规则时使用。

持久化对象(Persistent Object)

  • 作用:与数据存储直接交互的对象,通常包含数据访问逻辑。

  • 使用场景:执行数据库操作,如CRUD(创建、读取、更新、删除)操作。

业务对象(Business Object)

  • 作用:封装业务逻辑和业务数据,通常与领域对象交互。

  • 使用场景:在业务逻辑层实现业务需求时使用。

应用对象(Application Object)

  • 作用:封装应用程序的运行时配置和状态,通常不直接与业务逻辑相关。

  • 使用场景:在应用程序启动或运行时配置时使用。

数据访问对象(Data Access Object, DAO)

  • 作用:提供数据访问的抽象接口,定义了与数据存储交互的方法。

  • 使用场景:需要进行数据持久化操作时,作为数据访问层的一部分。

服务层(Service Layer)

  • 作用:包含业务逻辑和业务规则,协调应用程序中的不同组件。

  • 使用场景:处理业务逻辑,执行业务用例。

控制器层(Controller Layer)

  • 作用:处理用户的输入,调用服务层的方法,并返回响应结果。

  • 使用场景:处理HTTP请求和响应,作为Web应用程序的前端和后端之间的中介。

  • 案例介绍 

  1. 用户注册

    • DTO:用户注册信息的传输。

    • Entity:用户信息在数据库中的存储形式。

    • Service Layer:验证用户信息、加密密码等业务逻辑。

  2. 商品展示

    • Entity:数据库中的商品信息。

    • DTO:商品信息的传输对象,可能包含图片URL等不需要存储在数据库的字段。

    • Service Layer:获取商品列表、筛选和排序商品等。

  3. 订单处理

    • Domain Object:订单的业务领域模型,包含订单状态等。

    • Business Object:订单处理的业务逻辑。

    • DAO:订单数据的持久化操作。

  4. 配置加载

    • Application Object:应用程序的配置信息,如数据库连接字符串。

  5. API响应

    • Controller Layer:处理API请求,调用服务层,返回DTO作为响应。

  • 案例代码  

  1. 视图对象(VO)

    一个订单系统,我们需要在用户界面展示订单详情:  

// OrderDTO - 数据传输对象
public class OrderDTO {
    private Long id;
    private String customerName;
    private BigDecimal totalAmount;
    // Constructors, getters and setters
}
// OrderVO - 视图对象
public class OrderVO {
    private Long id;
    private String customerFullName; // 格式化后的顾客姓名
    private String formattedTotal; // 格式化后的总金额,如"$1,234.56"
    private String orderDate; // 格式化后的订单日期
    // Constructors, getters and setters
    public OrderVO(OrderDTO dto) {
        this.id = dto.getId();
        this.customerFullName = formatName(dto.getCustomerName());
        this.formattedTotal = formatCurrency(dto.getTotalAmount());
        this.orderDate = formatDateTime(dto.getOrderDate());
    }
    private String formatName(String name) {
        // 实现姓名格式化逻辑
        return name;
    }
    private String formatCurrency(BigDecimal amount) {
        // 实现货币格式化逻辑
        return "$" + amount.toString();
    }
    private String formatDateTime(Date date) {
        // 实现日期时间格式化逻辑
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }
}

实体类(Entity) 

package com.example.model;
import javax.persistence .*;

  @Entity
  @Table(name = "users")
  public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable = false, unique = true)
    private String username;
    @Column(nullable = false)
    private String password;

    // Constructors, getters and setters
    public UserEntity() {
    }

    public UserEntity(String username, String password) {
      this.username = username;
      this.password = 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;
    }
  }
  •  数据传输对象(DTO)

package com.example.dto;

public class UserDTO {

  private Long id;
  private String username;

  // Constructors, getters and setters
  public UserDTO() {
  }

  public UserDTO(Long id, String username) {
    this.id = id;
    this.username = username;
  }

  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;
  }
}
  • 领域对象(Domain Object)

package com.example.domain;

public class UserDomain {

  private Long id;
  private String username;

  // Business logic methods
  public UserDomain() {
  }

  public UserDomain(Long id, String username) {
    this.id = id;
    this.username = username;
  }

  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;
  }
// Additional domain-specific methods
}

 领域对象通常包含业务领域内的概念和逻辑。在订单系统中,这可能包括订单状态、订单项、总价等。

package com.example.domain;
    import java.util.List;

public class OrderDomain {

  private String orderId;
  private List<OrderItemDomain> items; // 订单项列表
  private double totalAmount;
  private OrderStatus status; // 订单状态

  // Constructors, getters and setters
  public OrderDomain(String orderId, List<OrderItemDomain> items) {
    this.orderId = orderId;
    this.items = items;
    this.totalAmount = calculateTotalAmount();
    this.status = OrderStatus.PENDING; // 默认状态为待处理
  }

  private double calculateTotalAmount() {
    double total = 0;
    for (OrderItemDomain item : items) {
      total += item.getPrice() * item.getQuantity();
    }
    return total;
  }

  // 业务逻辑方法,例如更新订单状态
  public void processPayment() {
// 处理支付逻辑
    if (/* 支付成功条件 */) {
      this.status = OrderStatus.PAYMENT_COMPLETED;
    }
  }
// 更多业务逻辑方法...
}
  • 持久化对象(Persistent Object)

package com.example.model;
public class UserPersistent extends UserEntity {
// Methods to interact with persistence layer, extending UserEntity
}
  • 业务对象(Business Object)

package com.example.service;

public class UserBO {

  private UserDomain userDomain;

  public UserBO(UserDomain userDomain) {
    this.userDomain = userDomain;
  }

  // Business logic methods
  public void performBusinessLogic() {
// Implement business logic
  }
}

OrderBO 业务对象通常封装业务逻辑,可能包含领域对象,并提供业务操作的方法。

package com.example.service;
    import com.example.domain.OrderDomain;

public class OrderBO {

  private OrderDomain orderDomain;

  public OrderBO(OrderDomain orderDomain) {
    this.orderDomain = orderDomain;
  }

  // 执行订单处理的业务逻辑
  public void performOrderProcessing() {
// 例如,处理订单支付
    orderDomain.processPayment();
// 其他业务逻辑...
  }
// 更多业务逻辑方法...
  • 应用对象(Application Object)

package com.example.config;
public class AppConfig {
private String environment;
private String configFilePath;
public AppConfig() {
// Initialize with default values or environment-specific settings
}
// Methods to handle application configuration
public void loadConfiguration() {
// Load configuration from files, environment variables, etc.
}
// Getters and setters
}
  • 数据访问对象(Data Access Object)


package com.example.dao;
    import com.example.model.UserEntity;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;

@Repository
public interface UserDAO extends JpaRepository<UserEntity, Long> {

  // Custom data access methods if needed
  UserEntity findByUsername(String username);
}

OrderDAO DAO 提供数据访问的抽象接口,定义了与数据存储交互的方法。在Spring Data JPA中,可以继承 JpaRepository并添加自定义的数据访问方法。

package com.example.dao;
    import com.example.domain.OrderDomain;
    import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderDAO extends JpaRepository<OrderDomain, String> { // 主键类型为String

  // 自定义数据访问方法,例如根据订单状态查询订单
  List<OrderDomain> findByStatus(OrderStatus status);
}
  • 服务层(Service Layer)

package com.example.service;
    import com.example.dao.UserDAO;
    import com.example.dto.UserDTO;
    import com.example.model.UserEntity;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

@Service
public class UserService {

  private final UserDAO userDAO;

  @Autowired
  public UserService(UserDAO userDAO) {
    this.userDAO = userDAO;
  }

  public UserDTO getUserById(Long id) {
    UserEntity userEntity = userDAO.findById(id)
        .orElseThrow(() -> new RuntimeException("User not found"));
    return convertToDTO(userEntity);
  }

  private UserDTO convertToDTO(UserEntity entity) {
    UserDTO dto = new UserDTO();
    dto.setId(entity.getId());
    dto.setUsername(entity.getUsername());
    return dto;
  }
// Additional service methods
}

OrderService服务层协调用户输入、业务逻辑和数据访问。它使用DAO进行数据操作,并可能使用业务对象来执行业务逻辑。

package com.example.service;
    import com.example.dao.OrderDAO;
    import com.example.domain.OrderDomain;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;

@Service
public class OrderService {

  private final OrderDAO orderDAO;

  @Autowired
  public OrderService(OrderDAO orderDAO) {
    this.orderDAO = orderDAO;
  }

  public List<OrderDomain> findAllOrders() {
    return orderDAO.findAll();
  }

  public OrderDomain getOrderById(String orderId) {
    return orderDAO.findById(orderId).orElseThrow(() -> new RuntimeException("Order not found"));
  }

  public void processOrderPayment(String orderId) {
    OrderDomain order = getOrderById(orderId);
    OrderBO orderBO = new OrderBO(order);
    orderBO.performOrderProcessing();
// 更新订单状态等逻辑...
  }
// 更多服务层方法...
}
  • 控制器层(Controller Layer)

package com.example.controller;
    import com.example.dto.UserDTO;
    import com.example.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

  private final UserService userService;

  @Autowired
  public UserController(UserService userService) {
    this.userService = userService;
  }

  @GetMapping("/{id}")
  public UserDTO getUser(@PathVariable Long id) {
    return userService.getUserById(id);
  }
// Additional controller endpoints
}

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值