Appearance
Java开发中实体对象命名规范及用途
我们通常使用不同的后缀来区分不同用途的实体对象,下面列出常见的几种:
- Entity:用于JPA实体,与数据库表对应。
- DTO (Data Transfer Object):用于层与层之间传输数据,通常不包含业务逻辑。
- VO (Value Object):通常用于前端展示,或者作为值对象。
- BO (Business Object):业务对象,包含业务逻辑。
- PO (Persistent Object):持久化对象,与数据库表对应,类似于Entity。
- POJO (Plain Old Java Object):简单的Java对象,没有特别限制。
- Form / Request:用于接收前端请求参数。
- Query:用于查询条件封装。
- Response:用于返回给前端的响应。
- Command:用于存放命令对象(很少情况下简写CMD,不建议简写)。
- Message:用于封装消息,通常不包含业务逻辑。
命名建议
| 对象类型 | 推荐命名 | 示例 | 说明 |
|---|---|---|---|
| DTO | 全大写 | UserDTO | 行业标准,广泛接受 |
| VO | 全大写 | UserVO | 行业标准,广泛接受 |
| BO | 全大写 | UserBO | 行业标准,广泛接受 |
| PO | 全大写 | UserPO | 行业标准,广泛接受 |
| Command | 完整单词 | UserCommand | 不建议简写 |
| Request | 完整单词 | UserRequest | 不建议简写 |
| Response | 完整单词 | UserResponse | 不建议简写 |
| Message | 完整单词 | UserMessage | 不建议简写 |
| Form | 完整单词 | UserForm | 不建议简写 |
| Query | 完整单词 | UserQuery | 不建议简写 |
| Command | 完整单词 | UserCommand | 不建议简写 |
总包名选择标准
- domain:适合DDD(领域驱动设计)项目
- model:适合传统MVC架构
- entity:适合以数据为中心的项目(会跟Entity对象重复,一般不建议使用)
- data:适合数据访问层明确分离的项目
Entity(实体)
命名方式:直接使用业务名称,或加 Entity 后缀
java
@Entity
@Table(name = "user")
public class User {
// 或 UserEntity
private Long id;
private String username;
private String password;
private Date createTime;
}使用场景:
- 与数据库表直接映射的领域对象
- JPA/Hibernate/MyBatis等ORM框架使用
- 包含数据库字段对应的属性和注解
特点:
- 包含数据库主键、关系映射
- 通常与数据库表一一对应
- 可能包含JPA/Hibernate注解
DTO(数据传输对象)
命名方式:业务名 + DTO 后缀
java
public class UserDTO {
private Long id;
private String username;
private String email;
// 不包含password等敏感字段
// 转换方法
public static UserDTO fromEntity(User user) {
UserDTO dto = new UserDTO();
dto.setId(user.getId());
dto.setUsername(user.getUsername());
dto.setEmail(user.getEmail());
return dto;
}
}使用场景:
- 不同层之间数据传输
- 避免暴露Entity的敏感字段
- 前端与后端接口数据交换
- 微服务间API调用
VO(值对象/视图对象)
命名方式:业务名 + VO 后缀
java
public class UserVO {
private Long id;
private String username;
private String nickname;
private String avatar;
private List<String> roles;
// 包含前端展示需要的组合数据
}使用场景:
- 前端页面展示数据
- 包含多个Entity的组合数据
- 特定视图的定制化数据
BO(业务对象)
命名方式:业务名 + BO 后缀
java
public class OrderBO {
private Order order;
private List<OrderItem> items;
private User user;
private BigDecimal totalAmount;
// 包含业务方法
public boolean validateStock() {
return items.stream().allMatch(item ->
item.getProduct().getStock() >= item.getQuantity());
}
}使用场景:
- 业务逻辑处理对象
- 包含多个Entity的聚合
- 封装复杂业务规则
PO(持久化对象)
命名方式:业务名 + PO 后缀
java
public class UserPO {
private Long id;
private String name;
// 严格的数据库字段映射
}使用场景:
- MyBatis等ORM中的数据库映射对象
- 与数据库表严格对应
POJO(简单Java对象) 命名方式:简单的业务名称
java
public class User {
private Long id;
private String name;
// 简单的getter/setter,无复杂逻辑
}使用场景:
- 简单的数据承载对象
- 不依赖任何框架
- 临时数据传输
Form、Request(表单、请求对象)
命名方式:业务名 + Form、Request 后缀
java
public class UserCreateForm {
@NotBlank
private String username;
@Email
private String email;
@Size(min = 6)
private String password;
// 包含表单验证注解
}使用场景:
- 接收前端请求参数
- 表单数据验证
- Controller层入参
Query(查询对象)
命名方式:业务名 + Query 后缀
java
public class UserQuery {
private String username;
private String email;
private Integer page;
private Integer size;
// 查询条件封装
}使用场景:
- 查询条件封装
- 分页查询参数
- 搜索过滤条件
Response(响应对象)
命名方式:业务名 + Response 后缀
java
public class UserResponse {
private boolean success;
private String message;
private UserVO data;
// API响应格式
}使用场景:
- API接口统一响应格式
- 包含状态码、消息等元数据
各层转换关系
text
Controller层: Form/Request → Service层: DTO/BO → Repository层: Entity/PO
↓ ↓ ↓
Response ←-------------------- VO ←------------------- Entity实际应用示例
java
// 用户注册流程示例
@Entity
public class User {
private Long id;
private String username;
private String password;
}
public class UserRegisterForm {
private String username;
private String password;
private String email;
}
public class UserDTO {
private Long id;
private String username;
private String email;
}
public class UserVO {
private Long id;
private String username;
private String nickname;
}
@Service
public class UserService {
public UserVO register(UserRegisterForm form) {
// Form -> Entity -> DTO -> VO 转换
User user = convertToEntity(form);
user = userRepository.save(user);
return convertToVO(user);
}
}选择原则
- Entity:严格对应数据库表结构
- DTO:服务层数据传输,隐藏敏感信息
- VO:前端展示,聚合多个数据源
- Form/Request:接收用户输入,包含验证
- BO:复杂业务逻辑封装
根据项目架构和个人习惯选择,保持团队一致性