首页 > 其他分享 >一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO

一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO

时间:2024-07-09 13:00:58浏览次数:16  
标签:username DO DTO String DAO private id example public

image.png

在现代软件架构中,不同类型的类扮演着不同的角色,共同构成了一个清晰、模块化和可维护的系统。以下是对实体类(Entity)、数据传输对象(DTO)、领域对象(Domain Object)、持久化对象(Persistent Object)、业务对象(Business Object)、应用对象(Application Object)、数据访问对象(Data Access Object, DAO)、服务层(Service Layer)和控制器层(Controller Layer)的总体介绍:

肖哥弹架构 跟大家“弹弹” 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

不同领域作用

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作为响应。

案例代码

视图对象(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
}

总结

这些不同类型的类和层共同构成了一个分层的软件架构,每一层都有其特定的职责和功能。这种分层方法有助于降低系统的复杂性,提高代码的可维护性和可扩展性。通过将业务逻辑、数据访问和用户界面分离,开发人员可以独立地更新和测试每个部分,从而提高开发效率和应用程序的稳定性。

历史热点文章

标签:username,DO,DTO,String,DAO,private,id,example,public
From: https://blog.csdn.net/alises1314/article/details/140292019

相关文章

  • IIS部署后运行报错:“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporar
    IIS报错当前标识(IISAPPPOOL.NETv4.5)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\TemporaryASP.NETFiles”的写访问权限。解决方法:1、以管理员权限运行PowerShell2、输入以下指令:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Aspnet_regiis.exe-ga'......
  • WPF MouseWheel MouseDown MouseUp MouseMove mapped in mvvm via behavior
    //xaml<Windowx:Class="WpfApp201.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • (八)ADO.NET用窗体应用程序写增删查改——改(1.1升级版)
    在1.0版本中,紧接前面两节“增”、“删”、“查”代码,这里新增“改”功能一、首先编辑好要修改的控件和相关属性,这里“编号”默认只读属性(ReadOnly)二、其次,修改下窗体显示的代码,让数据直接显示出来,这里我们用一个方法封装好,直接在窗体加载事件(Load)中调用即可。privatevoidFo......
  • nvidia docker Cannot load libnvcuvid.so.1
    问题使用docker对runtime进行封装,程序需要用到GPU且在host正常运行,在容器内则报错:Cannotloadlibnvcuvid.so.1[hevc_cuvid@0x559da3fbd80]Failedloadingnvcuvid.terminatecalledafterthrowinganinstanceof'std::runtime_error'what():failedtoopenavcod......
  • Docker日志批量清理
    转发:原文:https://blog.csdn.net/u013737132/article/details/134639909Docker容器日志查看查看所有容器数据大小并按倒序排列:du-d1-h/var/lib/docker/containers|sort-rhdu:用于估算文件或目录空间使用量。-d1:仅显示深度为1的目录,即只显示直接子目录的信息。......
  • Windows远程桌面的奇技淫巧
    前言Windows远程桌面简介远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者连上提供微软终端机服务的计算机(称为服务端或远程计算机)远程桌面的前置条件在获取权限后,针对3389进行展开,先查询3389端口是否开启netstat-ano|findstr3389发现没有开启(也......
  • Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时
    章节内容上一节我们完成了:HiveServer2的介绍和配置安装修改core-sizehdfs-site实现集群的启动Beeline简单上手HCatalog简单上手背景介绍这里是三台公网云服务器,每台2C4G,搭建一个Hadoop的学习环境,供我学习。之前已经在VM虚拟机上搭建过一次,但是没留下笔记,这次......
  • 君方智能设计平台-事务管理(Redo/Undo)技术方案
    1.背景介绍事务处理是指对数据进行一组操作,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。软件的事务管理主要实现方案主要涉及以下几个方面:(1)数据一致性:在CAD软件中,数据一致性是指确保所有操作都遵循一定的顺序,以避免意外的后果。例如,在编辑图形时,确保先删除......
  • docker安装mysql8.0.23
    拉取镜像dockerpullmysql:8.0.23创建挂载文件mkdir-p/home/docker/mysql/confmkdir-p/home/docker/mysql/datamkdir-p/home/docker/mysql/logcd/home/docker/mysql/conftouchmy.cnf编辑my.cnfvimy.cnf内容如下:default-character-set=utf8[mysql]defa......
  • Ubuntu安装docker
    1、首先查看内核以及架构详细信息命令uname-aPS:安装的是较新版本的ubuntu22.04.2的可以省略(我安装的就是这个版本) 2、安装软件之前的尽可能下意识执行的三个命令sudoapt-getupdatesudoapt-getupgradesudoapt-getfull-upgrade 3、添加Docker库1)安装必要的证书......