前言
最近在写代码的时候,对于Entity、VO、DTO的概念有些混淆,不太了解具体的用途以及作用,所以想梳理一下。
概念
阿里巴巴Java开发手册中介绍:
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service 或Manager 向外传输的对象。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
我的理解如下:
实体类有 VO DTO和Entity三种,其中:
- Entity就是一般和数据库对应的实体类,需要与数据库一一对应。
- DTO是数据传输对象,用来接收前端传过来的参数,一般会把前端传过来的参数封装进DTO,然后在Service中复制给新new的entity对象,然后进行持久化。
- VO就是返回给前端的视图对象。
案例
UserPhoneModifyEntity:
@Data
@TableName("user_phone_modify")
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "修改用户手机号")
public class UserPhoneModify extends Model<UserPhoneModify> {
private static final long serialVersionUID = 1L;
/**
* PK
*/
@ApiModelProperty(value = "PK")
@TableId(type = IdType.ASSIGN_ID)
private String id;
/**
* 逻辑删除标记(0:显示;1:隐藏)
*/
@ApiModelProperty(value = "逻辑删除标记")
private String delFlag;
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "姓名")
@NotNull(message = "姓名不能为空")
@NotBlank(message = "姓名不能为空")
private String userName;
@ApiModelProperty(value = "工号")
@NotNull(message = "工号不能为空")
@NotBlank(message = "工号不能为空")
private String workNo;
@ApiModelProperty(value = "新手机号")
@NotNull(message = "新手机号不能为空")
@NotBlank(message = "新手机号不能为空")
private String newMobile;
@ApiModelProperty(value = "旧手机号")
@NotNull(message = "旧手机号不能为空")
@NotBlank(message = "旧手机号不能为空")
private String oldMobile;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "创建者")
private String createBy;
@ApiModelProperty(value = "最后更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "更新者")
private String updateBy;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "审核状态(0审核中 1审核通过 2审核不通过)")
private String verifyStatus;
}
要与UserPhoneMapper.xml的resultMap 一一对应。
<resultMap id="userPhoneRecordMap" type="com.entity.user.UserPhoneModify">
<id property="id" column="id"/>
<result property="delFlag" column="del_flag"/>
<result property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="workNo" column="work_no"/>
<result property="newMobile" column="new_mobile"/>
<result property="oldMobile" column="old_mobile"/>
<result property="verifyStatus" column="verify_status"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
<result property="remark" column="remark"/>
</resultMap>
现在有一个需求,需要在user_phone_modify表中关联查询出go_hr_emp表的mobile字段作为user_phone_modify表的sap_new_mobile,并在前端显示出来。
注意:sap_new_mobile 这个字段user_phone_modify表里是没有的。
这时候就可以用到VO了。
UserPhoneModifyVO
/**
* @Description: 新增SAP系统新手机号查询修改用户手机号
*/
@Data
@ApiModel(description = "修改用户手机号")
public class UserPhoneModifyVO {
/**
* PK
*/
@ApiModelProperty(value = "PK")
private String id;
/**
* 逻辑删除标记(0:显示;1:隐藏)
*/
@ApiModelProperty(value = "逻辑删除标记")
private String delFlag;
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "姓名")
private String userName;
@ApiModelProperty(value = "工号")
private String workNo;
@ApiModelProperty(value = "新手机号")
private String newMobile;
@ApiModelProperty(value = "旧手机号")
private String oldMobile;
/**
* SAP系统新手机号
*/
@ApiModelProperty(value = "SAP系统新手机号")
private String sapNewMobile;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "创建者")
private String createBy;
@ApiModelProperty(value = "最后更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "更新者")
private String updateBy;
@ApiModelProperty(value = "备注")
private String remark;
/**
* 审核状态(0审核中 1审核通过 2审核不通过)
*/
@ApiModelProperty(value = "审核状态(0审核中 1审核通过 2审核不通过)")
private String verifyStatus;
}
UserPhoneMapper.xml要添加下面的代码:
<resultMap id="userPhoneRecordMap1" type="com.vo.UserPhoneModifyVO">
<id property="id" column="id"/>
<result property="delFlag" column="del_flag"/>
<result property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="workNo" column="work_no"/>
<result property="newMobile" column="new_mobile"/>
<result property="oldMobile" column="old_mobile"/>
<result property="sapNewMobile" column="sap_new_mobile"/>
<result property="verifyStatus" column="verify_status"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
<result property="remark" column="remark"/>
</resultMap>
<sql id="selectUserPhoneVo">
id, del_flag, user_id, user_name, work_no, new_mobile, old_mobile ,verify_status ,create_time ,create_by
,update_time ,update_by,remark
</sql>
<select id="selectPage1" resultType="com.vo.UserPhoneModifyVO" resultMap="userPhoneRecordMap1">
select <include refid="selectUserPhoneVo"/>,h.mobile as sap_new_mobile
from user_phone_modify u left join go_hr_emp h
on h.userId=u.work_no;
</select>
DTO:
当前端自定义paramsSubmit对象需要传入后端时:
paramsSubmit: {
id: "",
serviceNameList: "",
},
后端
第一步:WhiteListUpdateDTO
@Data
public class WhiteListUpdateDTO {
private String id;
/**
* 服务名称列表
*/
private String serviceNameList;
}
第二步:control
@ApiOperation(value = "修改白名单记录")
@PutMapping
public R update(@RequestBody WhiteListUpdateDTO whiteListUpdateDTO) {
return R.ok(whiteListService.updateWhiteList(whiteListUpdateDTO));
}
具体可看此篇的后端描述部分:【ids】改造白名单功能