目录
VO(View Object)🏷️
DAO(Data Access Object)🏷️
DTO(Data Transfer Object)🏷️
PO(Persistence Object)🏷️
BO(Business Object)🏷️
名词解释
首先说VO(View Object)😊 这个最好理解了
- 也有人说这是Value Object 这个就自行斟酌了 但说的都是一个东西
就是后端返回给前端的数据都是VO对象
那为什么会有这一层呢? 为什么数据库返回的数据 不直接返回给前端?
首先vo层还是很有必要的 比如说数据库有这么一个性别字段sex
0 表示女👰
1 表示男👱
2 表示保密👽
{
"name": "Likefr",
"sex": 0 // 女
// ...
}
以上是数据库查询出来的数据 这么直接将数据返回给前端的确没有问题😅 前端判断sex的值 在页面显示男女亦或者是保密
但是现在我们会根据不同门户 返回 不一样的字段 比如
A页面希望服务返回的性别字段不再是sex
而是gender
B页面希望服务返回的姓名字段是nickname
再或者某个页面要求C服务返回的性别值不再是 0 、1 而是 🙇帅哥 、或者🙅美女
其次VO层 还能有效避免泄露我们数据库真实的字段 如:
数据库年龄字段 age
vo层年龄字段 year
回到设计层面 服务层(Service)只负责处理业务数据 ,而视图层(Controller)展示层负责渲染我们的数据
命名实例: UserVo ProcudtVo
随便说一嘴 服务层返回的数据 如果需要有VO层 则需要new xxxVo 然后setXX 去赋值
这会增大代码量 我这边推荐这两种
- spring beanutils属性拷贝
- mapstruct
个人是喜欢 mapstruct
实体映射
DAO又是什么?🚒
其实就是mapper 和数据库直接打交道
@Mapper
public interface SysUserMapper extends BaseMapper<xxxPo> {}
// 熟悉的不能在熟悉了吧?
这一层 实在 服务业务层面 与数据库中间 也就是在 service 具体实现里边 注入 xxxMapper 然后执行调用mysql 返回数据
那么 该类 继承的BaseMapper<xxxPo>又是什么?
xxxPo 一会下面会单独说 🅰🅰🅰
BaseMapper
是mybatis包下的一个基类 包含了常用的增删改查😾
如果还不能满足我们的需求 我们也可以自定义自己的需求步骤如下:
- mapper内声明一个接口
- 编写xml文件 实现这个接口去执行我们的mysql
命名规范: 一般都是xxxMapper 或 xxxDAO
DTO (数据传输对象)🚃
DTO 这个我不多说 他有很大歧义😌
他有几种存在的形式:
- controller 层定义dto用来接收前端传过来的参数
- dto 类声明一些数据库不存在的字段 这些字段的意义就是 业务层处理过后的数据 方便数据交互
- 把dto 当作vo来使用 返回给前端
命名规范: xxxDTO (xxx为业务领域相关的名称)
PO(持久化对象)🚀
PO等同于Entity 需要实现Serializable接口
public class UserPo implements Serializable {}
// 或
public class User implements Serializable {}
这个PO里的字段与应数据库的字段一一对应
一个PO就对应数据库的一条记录
正常来说 不会出现与数据库表无关紧要的字段😼
🅰🅰🅰
还记得 上面的dao吗?
public interface SysUserMapper extends BaseMapper<**xxxPo**> {}
泛型xxxPo通过基类BaseMapper中的方法,结合PO对数据库进行相关的操作
比如查询用户表 那么就返回UserPo 这个实体
BO Business Object(业务对象)🚬
BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。
主要用于封装复杂业务逻辑😵、用的比较多的封装到bo实体中
简单的说BO就是针对实体中对数据进行检索或处理的对象
就比如 有这么一个订单BO实体
public class OrderBO {
private Long id;
// 商品列表
private List<Product> products;
// 价格
private BigDecimal totalPrice;
// 构造函数、getter 和 setter 略
// 计算订单总价
public void calculateTotalPrice() {
// 根据订单中的商品计算总价
totalPrice = BigDecimal.ZERO;
for (Product product : products) {
totalPrice = totalPrice.add(product.getPrice());
}
}
// 提交订单
public void submitOrder(User user) {
// 执行提交订单的业务逻辑
// 可能包括库存检查、订单状态更新等操作
}
// 其他业务方法...
}
BO中的业务方法仅仅是针对一个同一个实体对象,如果BO里的方法体处理逻辑涉及到有多个实体对象,则方法应该放在Service接口中并实现
bo 实体类 支持序列化和反序列化, 这就很方便的流通 只需要反序列化后即可调用内部方法 和工具类一样
这么解释 我不知道 你是否能明白?😳😳😳
DO
DO 在业界有两个版本🌟🌟🌟
一个是阿里巴巴的开发手册中的定义 DO( Data Object)
(数据对象)🌻
- 和mysql表字段相同
- 这个通常是个数据传输对象
- 和业务逻辑无关
- 主要关注数据的结构和传输
这个等同于前面的PO
另一个是在DDD(Domain-Driven Design)领域驱动设计中 DO(Domain Object)
🍄
- 与数据库结构无关
- 主要关注业务
这个等同于上面的BO
最后 看到标题这么多o也不要慌 他们都可以统称为pojo
那什么是pojo 🙀?
POJO 是指普通的 Java 对象(Plain Old Java Object)
大白话就是 很简单的一个类 很简单很简单的一个类💪
那么怎么才能算是一个pojo类呢? 下面是他的定义
- 没有继承任何类
- 没有实现任何接口
- 不依赖任何注解
- 有一些private字段的属性
- 只包含get set 方法
public class User {
private String username;
private String email;
// 构造函数
public User() {
}
public User(String username, String email) {
this.username = username;
this.email = email;
}
// getter 和 setter 方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// toString 方法
@Override
public String toString() {
return "User{" +
", username='" + username + '\'' +
", email='" + email + '\'' +
'}';
}
}
像不像各位在刚学习java的时候纯手写的代码💦💦
tips:
值得一说的是 禁止命名为 xxxPOJO❗❗❗❗
因为他是BO VO PO DO等对象的统称
整个执行时序图
"感谢大家阅读本文🌹🌹,希望能对大家有所帮助。如果你对本文中的内容感兴趣,欢迎关注我的更多文章😼😼😼,我们将继续分享更多有趣、实用的技术知识🍓。同时,也欢迎大家留下宝贵的意见和建议,让我们共同进步,共同成长。祝大家学习进步,工作顺利!🙏🙏"