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就可以了。如果有代码规范的要求,以便多人协作开发,可以参考本文章的写法。