java架构之项目结构(entity / DTO / VO)

本文深入解析Java中的多种对象类型,包括EJB、JavaBean、POJO、Entity、DTO及VO,阐述它们的区别与应用场景,以及在多模块项目结构中的角色与联系。

定义类的讲究

  • ejb

Enterprise JavaBean(EJB),企业javaBean。是java的核心代码,分别是会话Bean(Session Bean)、实体Bean(Entity Bean)、和消息驱动Bean(MessageDriven Bean)。

  • javaBean

可重用组件,类必须是具体的公开的,具有无参构造器。

  • pojo

Plain Ordinary Java Object,简单的Java对象,普通的javaBean。除了getter、setter,不能有其他业务方法。有时可以作为VO(value-object)或DTO(Data Transfer Object)来使用。


  • entity

持久化,与数据库对应;

实体bean,一般是用于ORM对象关系映射,一个实体映射成一张表,一般无业务逻辑代码。

负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个EntityBean对象相当于创建一条记录,删除一个EntityBean对象会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。

  • DTO

系统、服务之间交互传输用;

数据传输对象(Data Transfer Object

dto是做表示层(展示给用户)的,而实体是数据对象(表)。表示层dto的是由多个实体构成,或一个实体的一个部分,或多个实体的各个部分的结合体?如果你认为dto没有必要,难道你做数据库的时候,表与页面的展示是一摸一样的吗?不太现实吧。

dto是面向对象的,实体是面向关系数据库。

  • VO(和DTO类似)

前台(APP\WAP\PC)展示用;

作用说明:
1、DTO可以增加或者减少entity的字段,来灵活实现信息传递;
2、VO可以仅向前端传输,页面需展示字段,如pageList等。


关系示例

多模块或单模块的项目而言,清晰的项目结构很重要。

如下,一个项目可以分为许多模块,如common模块和其他模块。

project
  |-- common
  |-- module1
  |-- ...

其中
|-- common
           |--dao
                 |--impl
                 |--*DAO.java
           |--dto
                 |--*DTO.java
           |--domain
                 |--entity
                 |--*Entity.java

可以在resources中单独写mapper.xml


|-- module1
           |--model
                 |--*VO.java
           |--controller
           |--service
           |--interceptor
           |--...

说明:

  1. [controller] controller是从用户接受和发送数据的地方。因此controller中返回结果中的数据类型为*VO类型。
  2. [dao] 那么,mybatismapper中写的sql语句,如select等的返回结果是什么呢?
    可以是entity,可以是DTO。从一张表中查询部分或多表联合查询,就可以返回DTO

整个*mapper.xml*DAO对应,其中每个sql语句的返回类型可以是intListentityDTO等。

@RequestMapping(path = "/list", method = RequestMethod.POST)
public Res<**VO> yourmethoed(){
    //<*DTO> = service()...
    //DTO转VO,return VO
}
Java 项目中,特别是在 Spring Boot 等分层架构项目中,DTOVO、BO、Entity 是常见的数据模型类,它们各自有不同的职责和使用场景。以下是它们的**区别与使用场景**: --- ## ✅ 1. DTO(Data Transfer Object)数据传输对象 - **用途**:用于**接口之间数据传输**,通常是前后端交互、服务间调用时的请求参数或返回值。 - **特点**: - 不包含业务逻辑。 - 只包含属性和 getter/setter(常使用 Lombok 自动生成)。 - 用于**接收请求参数**或**返回给前端的数据结构**。 - **示例**: ```java public class UserDto { private String username; private String email; // getter/setter } ``` --- ## ✅ 2. VO(View Object)视图对象 - **用途**:用于**前端展示层**,通常用于封装前端页面或接口需要展示的数据。 - **特点**: - 数据可能是聚合多个业务对象后的结果。 - 可以包含格式化后的数据,比如 `String formattedBirthday`。 - 与前端展示逻辑强相关。 - **示例**: ```java public class UserVo { private String username; private String formattedCreateTime; // getter/setter } ``` --- ## ✅ 3. BO(Business Object)业务对象 - **用途**:用于**封装业务逻辑**,通常用于服务层内部处理。 - **特点**: - 包含一定的业务逻辑。 - 可能聚合多个 Entity 或其他 BO。 - 不直接暴露给前端或用于持久化。 - **示例**: ```java public class OrderBo { private OrderEntity orderEntity; private List<OrderItemEntity> items; public BigDecimal getTotalPrice() { return items.stream() .map(OrderItemEntity::getPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); } } ``` --- ## ✅ 4. Entity(实体对象) - **用途**:用于**与数据库表一一映射**,通常由 JPA、MyBatis 等 ORM 框架管理。 - **特点**: - 与数据库字段一一对应。 - 可能包含 ORM 注解(如 `@Entity`, `@Table`, `@Column` 等)。 - 不应包含复杂业务逻辑。 - **示例**: ```java @Entity @Table(name = "users") public class UserEntity { @Id private Long id; private String username; // getter/setter } ``` --- ## ✅ 总结对比表 | 类型 | 中文名 | 所属层 | 是否持久化 | 是否含业务逻辑 | 主要用途 | |--------|------------------|--------------|------------|----------------|----------------------------------| | DTO | 数据传输对象 | Controller层 | 否 | 否 | 接口请求参数/返回值 | | VO | 视图对象 | Controller层 | 否 | 否 | 前端展示数据 | | BO | 业务对象 | Service层 | 否 | 是 | 封装业务逻辑 | | Entity | 实体对象(数据库)| DAO层 | 是 | 否 | 与数据库映射,用于持久化和查询 | --- ## ✅ 分层调用关系示意 ``` 前端 <-> Controller(接收 DTO / 返回 VO) ↓ Service(处理业务逻辑,使用 BO 聚合 Entity) ↓ DAO <-> Entity(与数据库交互) ``` --- ## ✅ 举例说明 假设有一个用户注册流程: 1. **前端传入**: ```json { "username": "john", "password": "123456", "email": "john@example.com" } ``` → 使用 `UserDto` 接收。 2. **Service 层处理**: - 将 `UserDto` 转换为 `UserEntity` 存入数据库。 - 生成 `UserBo` 处理发送邮件等业务逻辑。 3. **返回给前端**: ```json { "username": "john", "registerTime": "2023-07-27 11:05" } ``` → 使用 `UserVo` 返回。 --- ## ✅ 总结建议 | 场景 | 推荐使用类型 | |----------------------------------|--------------| | 接口请求参数 | DTO | | 接口返回结果 | VODTO | | 数据库操作 | Entity | | 业务逻辑处理 | BO | | 需要聚合多个对象进行计算或处理 | BO | | 前端展示需要格式化字段 | VO | ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值