文章目录
- 先点击收藏和点赞,切勿白嫖,感谢
- 一丶PO(persistant object)持久对象
- 二丶VO(value object)值对象
- 三丶DAO(Data Access Objects) 数据访问对象接口
- 四丶BO/DO(Business Object) 业务对象层
- 五丶DTO(Data Transfer Object) 数据传输对象
- 六丶POJO(Plain Old Java Objects) 简单的Java对象
- 七丶Query 数据查询对象
- 八丶常见问题
- 业务图
- 如何在项目中应用这些对象
- VO可以复用吗?
- Controller层接收的参数是VO还是DTO?
- 九丶springboot案例
- 1. UserPO 类
- 2.UserDAO 接口
- 3.UserBO 类
- 4.UserService 类
- 5.UserController 类
项目中常见很多Dto.VO类等,下边简单简介下各种解释,这种知识知道了解即可
先点击收藏和点赞,切勿白嫖,感谢
先点赞再观看,谢谢
一丶PO(persistant object)持久对象
与数据库中的表相映射的java对象
二丶VO(value object)值对象
用于表示一个与前端进行交互的视图对象,它的作用是把某个指定页面(或组件)的所有数据封装起来。实际上,这里的 VO 只包含前端需要展示的数据,对于前端不需要的数据,比如数据创建和修改的时间等字段,出于减少传输数据量大小和保护数据库结构不外泄的目的,不应该在 VO 中体现出来
三丶DAO(Data Access Objects) 数据访问对象接口
顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间
四丶BO/DO(Business Object) 业务对象层
业务对象,就是从现实世界中抽象出来的有形或无形的业务实体。
五丶DTO(Data Transfer Object) 数据传输对象
用于表示一个数据传输对象,DTO 通常用于展示层(Controller)和服务层(Service)之间的数据传输对象。DTO 与 VO 概念相似,并且通常情况下字段也基本一致。但 DTO 与 VO 又有一些不同,这个不同主要是设计理念上的,比如 API 服务需要使用的 DTO 就可能与 VO 存在差异
六丶POJO(Plain Old Java Objects) 简单的Java对象
实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接.其中有一些属性及其getter、setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法
七丶Query 数据查询对象
数据查询对象,各层接收上层的的查询请求.注意,查过2个参数的需要封装到query类中,禁止使用Map类
八丶常见问题
业务图
如何在项目中应用这些对象
在一个典型的Spring Boot 项目中,这些对象的应用场景如下:
- Controller 层:接收请求,使用 VO 对象将数据返回给前端。
- Service 层:处理业务逻辑,使用 BO 对象封装业务逻辑。
- Repository 层:访问数据库,使用 DAO 对象进行数据操作。
- DTO 对象:在不同层或服务之间传递数据,特别是在微服务中。
- PO 对象:用于 ORM映射,与数据库表结构一一对应。
VO可以复用吗?
比如,一个接口需要VO,另一个接口需要VO加上别的一些数据,这种情况,是继承VO使用,还是再写一个VO?
答案:VO最好不要复用。VO目的就是解耦,应该是并列关系的,如果存在复用,那么就可能导致,一方修改影响另一方。一旦存在继承关系,继承来继承去,最后关系就会变得很乱,不好维护。
Controller层接收的参数是VO还是DTO?
希望大家根据公司情况来定,我们公司前端交互是统一VO的。
Controller层接收的应该是VO,但是根据情况而定,尤其是前后分离,有特定的前端开发人员时,因为DTO往往会添加很多额外的数据信息。
打个比方,用户新增,往往前端传递的是账户名、密码、创建人标识等等很少的信息,但是DTO作为一个中转数据,会添加例如更新人、用户状态等等其他的信息,如果前端传递的是DTO,如此多的额外信息会给前端造成很多问题。
如果是小项目的话,前后端都是一个人在进行,那就无所谓了,后端需要哪些,不需要哪些心里有数,传递DTO就无所谓了。
一般的数据传递是,前端传递VO给接口(Controller),接口将VO转为DTO传递给service,service将DTO分解为DO,调用领域服务进行调度,然后逆向转为VO或者其他的返回结果,传递给前台。
九丶springboot案例
1. UserPO 类
@Entity
@Table(name = "users")
public class UserPO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "password", nullable = false)
private String password;
// Getters and Setters
}
2.UserDAO 接口
@Repository
public interface UserDAO extends JpaRepository<UserPO, Long> {
UserPO findByUsername(String username);
}
3.UserBO 类
public class UserBO {
private String username;
private String encryptedPassword;
// 业务逻辑
public boolean isPasswordCorrect(String inputPassword) {
return encryptedPassword.equals(encryptPassword(inputPassword));
}
private String encryptPassword(String password) {
// 加密逻辑
return password; // 这里为了简化,实际应返回加密后的密码
}
// Getters and Setters
}
4.UserService 类
@Service
public class UserService {
@Autowired
private UserDAO userDAO;
public UserBO getUserByUsername(String username) {
UserPO userPO = userDAO.findByUsername(username);
UserBO userBO = new UserBO();
userBO.setUsername(userPO.getUsername());
userBO.setEncryptedPassword(userPO.getPassword());
return userBO;
}
}
5.UserController 类
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/getUser")
public UserVO getUser(@RequeryBody UserQuery query) {
UserBO userBO = userService.getUserByUsername(query);
UserVO userVO = new UserVO();
userVO.setUsername(userBO.getUsername());
return userVO;
}
}