
目录一.概述二. POJO的含义三. entity(实体)四. model(模型)五. domain(域)六. view(视图)七. DTO(数据传输对象)八. VO(真正视图层)九. Param(参数)十. 总结一.概述在日常开发的过程中如果我们接手一个新的项目之后通常会有各种各样的包想要搞清楚项目的基本架构当然就需要知道各种包做什么用的里面存放了那些东西。以便于我们理解项目的整体结构。我们都知道项目是要和数据库打交道的数据库中的一张表映射到Java代码种是一个实体类。在形目中我们通常会发现实体类用很多种不同的定义方法有叫 entity 的有叫 domain 的有叫 model 的有叫 pojo 的到底哪一种是最规范的呢本篇我们就来说说它们的区别。二. POJO的含义POJO 英文全称Plain Ordinary Java Object译为普通的 Java 对象就是常说的 JavaBean 对象通常会定义 Getter 和 Setter 方法以便于我们在业务层对对象属性值的存取操作。而 entitydomainmodelviewDTOVO都可以理解为 JavaBean也都可以理解为POJOPOJO是它们的抽象但是细分它们的区别还是会有所不同的。三. entity(实体)entity 实体类中的属性通常与数据库中的一张表的字段完全相应。如下是一张用户表 user表中有以下六个字段值那么 user 表对应的 entity 实体类 User 如下所示通常类中的字段会与数据库表中的字段一一对应Data public class User { private Long uid; private String username; private String password; private int age; private String email; private String sex; }除此之外还会有一些特殊情况比如所有的 entity 类可能都会继承某个基类 BaseEntity就拿上面的 user 表来说如果 user 数据库表中定义了 BaseEntity 类中的四个字段通常都是需要去继承BaseEntity类的如果 user 数据库表中没有定义 BaseEntity 类中的四个字段那么 user 类可以选择继承 BaseEntity 类也可以选择不继承 BaseEntity 类。换句话来说就是JavaBean 类中定义的属性可以比数据库表中的字段多也可以和数据库表中的字段相等也可以比数据库中的字段少但一般情况下都是一一对等的关系。Data public class BaseEntity { private String createUsername; private Date createTime; private String updateUsername; private Date updateTime; }四. model(模型)model 实体类中的属性通常可能含有数据库中多张表的字段有些业务中我们可能会去操作多张表。举个例子假如说某个业务需要查询AB两张表A表中有一个a1a2a3字段B表中有一个b1b2b3字段。SELECT A.*,B.* FROM A INNER JOIN B ON A.a1 B.b1 WHERE A.a2 #{model.a2} AND B.b2 #{model.b2}这个时候加入我们想要用一个实体类传参达到效果就必然要求这个实体类中既含有A类中字段属性有含有B表中的字段属性这种实体类我们就可以称之为 model 实体类Data public class SelectModel { private String a2; private String b2; }五. domain(域)domain 中通常可能含有多张表映射的 Java 对象还有一种业务需求可能需要查询多张表然后将查询到的数据全部返回此时我们就可以创建另外一种实体类该实体类中的属性不是八种基本数据类型而是其他自定义实体类我们将查询到但表数据封装到对应的实体类中再将多张表查询到的数据汇总到一起封装到 Domain 类中这就是域Data public class SelectDomain { private xxxEntity1 entity1; private xxxEntity2 entity2; private xxxEntity2 entity3; }六. view(视图)view 中通常含有数据库中多张表的部分字段视图我们就可以理解为呈现的东西在程序中视图就是展示给用户的数据。举个栗子如下为用户表对应的实体类 UserData public class User { private Long uid; private String username; private String password; private int age; private String email; private String sex; }在实际的业务中假设用户登陆成功我们不一定需要将用户的密码也展示出来也不一定需要将用户的ID展示出来假设用户登陆后只显示用户名和邮箱我们就重新定义一个视图实体类 UserView里面只定义 username 和 email 两个属性由此就有了视图 view在 view 中我们只会定义需要展示给用户看的字段属性这样我们在进行数据库查询的时候也是只查询这两个字段的值返回值类型就是用 UserView 来接收而不使用 User 实体类来接收减少了数据的传输Data public class UserView { private String username; private String email; }七. DTO(数据传输对象)和上面的 view 非常类似只是叫法名称不同八. VO(真正视图层)VO 就是我真正展示给用户去看的数据字段VO全称 View Object视图对象很多小伙伴可能会有疑惑DTO和view不是已经起到了视图层数据传输的效果了吗为什么还要使用VO呢其实不然小伙伴们可能知道在一些庞大复杂的项目中数据库表和表之间的外键约束会非常密切这样一来我们数据库表中存储的数据大多都是其他表的主键ID并不会存储具体的信息。这样一来我们数据库查询之后得到了一堆其它表的主键ID但这并不是我们想要的结果所以我们需要在业务层再去根据这些主键ID去各自对应的数据库表中查询用户想要的数据然后在返回查询到的数据我们通常会使用VO类来进行接收查询完毕我们将VO返回给前端展示这才算是一个业务流程真正完成。九. Param(参数)通常封装对数据库中字段做修改的数据或查询条件属性业务层中的方法大多都会采用实体类型传参因此通常会定义一个xxxParam实体类实体类中封装一些要对数据库表中字段进行修改的操作或是查询条件字段十. 总结虽然上面它们细分下来会有一些不同但在实际的项目中开发人员不一定会严格按照它们的规范去进行开发但一个项目中一般都会包含以下集中实体类型。第一种entityPOJO 实体数据访问层专门用来对数据库单表进行数据操作第二种viewDTO 数据传输层通常用作接收单表或夺表查询到的部分字段第三种VO 视图层通常用于存储页面真正展示的数据第四种Param 参数实体通常用于封装前端传递过来的数据后端可以根据Param中的参数对单表或多表进行CRUD操作