entity、VO、QO、DTO的区别

create table tb_dept(
	dept_id varchar(32) not null primary key,
	dept_name varchar(32) not null,
	dept_number varchar(32) not null,
	create_time datetime,
	create_by varchar(32),
	remark varchar(64),
	update_time datetime,
	update_by varchar(32),
	logic_delete tinyint(1) default 0
);

create table tb_employee(
	employee_id varchar(32) not null primary key,
	employee_name varchar(32) not null,
	create_time datetime,
	create_by varchar(32),
	update_time datetime,
	update_by varchar(32),
	logic_delete tinyint(1) default 0
);

1.entity

entity主要用来映射数据库的一张表结构,其字段与数据库的字段一一对应即可。
java的部门实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_dept")//指定映射的表名
public class Dept{
    @TableId(value = "dept_id", type = IdType.ASSIGN_ID)//主键,生成策略
	private String deptId;
	private String deptNumber;
	private String deptName;
    private String createBy;
    private String remark;//备注
    private LocalDateTime createTime;
    private String updateBy;
    private LocalDateTime updateTime;
    /**
     * 逻辑删除(0:未删除,1:已删除)
     */
    @JsonIgnore
    @TableLogic
    private Integer logicDelete;
}

员工实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_employee")//指定映射的表名
public class Employee{
    @TableId(value = "employee_id", type = IdType.ASSIGN_ID)//指定主键
	private String employeeId;
	private String employeeName;
	private String remark;
	private String createBy;
    private LocalDateTime createTime;
    private String updateBy;
    private LocalDateTime updateTime;
    /**
     * 逻辑删除(0:未删除,1:已删除)
     */
    @JsonIgnore
    @TableLogic
    private Integer logicDelete;
}

2.VO

VO:view object,视图对象。将需要返回给前端的字段封装成一个对象。业务数据需求:按部门id查询部门详情与相关员工信息。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeptVO{
	private String deptId;
	private String deptNumber;
	private String deptName;
    private String createBy;
    private String remark;
    private LocalDateTime createTime;
    private String updateBy;
    private LocalDateTime updateTime;
	private List<Employee> employeeList;//员工列表
}

VO的内容基本上和entity一样,考虑到对于不同业务所需的字段不一样【某些字段对前端不重要,就不封装进去】,封装不一样的VO。
一般发起查询请求时,后端给前端的数据是一个VO实体。根据不同的业务需求,可以制定多个VO类,以满足特定需求。

3.DTO

DTO:data transform object,数据传输对象。前端传递来的字段封装成一个DTO对象,比如将表单对象封装成一个DTO。在DTO中添加对表单字段数据的校验。
业务描述:新建一个部门,需要填写部门名称,部门id后台有自动生成策略,不需要传递,createXX和updateXX等可在后端设置信息,也可不用传递。因此在前端填写表单时,实际需要传递的字段只有部门名称、部门编号和部门描述备注。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeptDTO{
    /**
     * 新增
     */
    public interface AddDept{

    }

    /**
     * 修改
     */
    public interface EditDept{

    }
    /**
     * 部门id,校验,在编辑部门信息时,需要传递deptId字段
     */
    @NotBlank(message = "标准id不能为空", groups = {EditDept.class})
	private String deptId;
	/**
	*部门名称,不管是新增还是修改,部门名称都不能为空
	*/
	@NotBlank(message = "标准名称不能为空", groups = {AddDept.class, EditDept.class})
    @Length(message = "最大长度不能超过32个字符", max = 32, groups = {AddDept.class, EditDept.class})
	private String deptName;

	/**
	*部门编号
	*/
	@NotBlank(message = "标准名称不能为空", groups = {AddDept.class, EditDept.class})
    @Length(message = "最大长度不能超过32个字符", max = 32, groups = {AddDept.class, EditDept.class})
	private String deptNumber;
	
	/**
	*备注,部门信息描述,可填可不填,不加校验
	*/
	private String remark;
}

控制层使用:

@PostMapping("/addDept")
public AjaxResult addDept(@RequestBody @Validated(DeptDTO.AddDept.class) DeptDTO deptDTO) {
		...
    }

一般新增和更改业务中,前端向后端传递的表单将封装成一个DTO对象

4.QO

QO:查询对象。将查询条件封装成一个QO对象。业务描述:可通过部门名称、部门编号,创建的时间段进行查询。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeptQO{
    private String deptName;
    private String deptNumber;

    /**
     * 开始时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime beginTime;

    /**
     * 结束时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;

}

一般条件查询请求时,从前端传递一个QO对象到后端。

总结:entity、VO、DTO内容大致一样,存在小小的差别。在没有要求代码规范的情况下,用一个Entity就可以了。如果有代码规范的要求,以便多人协作开发,可以参考本文章的写法。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值