目录
1. 首先是百度百科的字面意思
2. POJO的类型分类
按阿里
《Java开发手册--嵩山版》
中POJO的解释为 专指只有 setter/getter/toString 的简单类,包括DO/DTO/BO/VO 等。
分别解释为:
个人理解需要注意的点:
XxxDO
很多公司也用XxxPO
(persistence object, 持久层对象)或XxxEntity
来表示。类中都定义的是对应数据库中的字段XxxVO
不具体属于哪个层,而是POJO在数据传递中的数据形式。简而言之,就是接口之间传递的数据封装。
表里面有十几个字段:id,name,gender(M/F),age……
页面需要展示三个字段:name,gender(男/女),age
VO由此产生,一是能提高数据传输的速度(减少了传输字段),二能隐藏后端表结构
下面一张关系图:
3. 对应的实例
所有例子使用lombok注解简化getter/setter方法
3.1 数据对象–XxxDO(PO、Entity)
- 以
DO
或PO
或Entity
或直接与表名一致无任何结尾
(阿里是为DO
为结尾) - Xxx 与数据库表名保持一致
- 类中字段要与数据库字段保持一致,不能缺失或者多余
- 类中的每个字段添加注释,并与数据库注释保持一致
- 不允许有组合
- 项目内的日期类型必须统一,建议使用 java.util.Date,java.sql.Timestamp,java.time.LocalDateTime 其中只一。
@Builder
@NoArgsConstructor
@Data
public class SysNoticeDo {
/** 公告ID */
private Long noticeId;
/** 公告标题 */
private String noticeTitle;
/** 公告类型(1通知 2公告) */
private String noticeType;
/** 公告内容 */
private String noticeContent;
/** 公告状态(0正常 1关闭) */
private String status;
}
3.2 传输对象–XxxDTO
- 不可以继承自
DO
DTO
可以继承、组合其他DTO
、VO
、BO
等对象DTO
只能用于前端、RPC 的请求参数
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@Data
public class CreateOrUpdateBookDTO {
@NotEmpty(message = "必须传入图书名")
@Size(max = 50, message = "图书名不能超过50字符")
private String title;
@NotEmpty(message = "必须传入图书作者")
@Size(max = 50, message = "图书作者名不能超过30字符")
private String author;
@NotEmpty(message = "必须传入图书综述")
@Size(max = 1000, message = "图书综述不能超过1000字符")
private String summary;
@Size(max = 100, message = "图书插图的url长度必须在0~100之间")
private String image;
}
3.3 业务对象–XxxBO
- 不可以继承自
DO
BO
对象只能用于service
,manager
,dao
层,不得用于controller
层
import lombok.Data;
@Data
public class FileBO {
/**
* 文件 id
*/
private Integer id;
/**
* 文件 key,上传时指定的
*/
private String key;
/**
* 文件路径
*/
private String path;
/**
* 文件 URL
*/
private String url;
}
3.4 视图对象–XxxVO
- 不可继承自
DO
VO
可以继承、组合其他DTO
、VO
、BO
等对象VO
只能用于返回前端、rpc 的业务数据封装对象
@Data
public class CategoryVO implements Serializable {
private Integer id;
private String name;
private Integer type;
private Integer parentId;
private Integer orderNum;
private Date createTime;
private Date updateTime;
private List<CategoryVO> childCategory = new ArrayList<>();
}
3.5 数据查询对象–XxxQuery
- Controller的请求参数
- 也有项目用
XxxRequest
/**
* @author : Gangbb
* @ClassName : ProductListQuery
* @Description : 查询商品列表的Query
* @Date : 2021/1/13 19:33
*/
public class ProductListQuery {
private String keyword;
private List<Integer> categoryIds;
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public List<Integer> getCategoryIds() {
return categoryIds;
}
public void setCategoryIds(List<Integer> categoryIds) {
this.categoryIds = categoryIds;
}
}