《阿里巴巴开发手册》以及网上各种博客或多或少都有提到诸如DTO、DO、BO、PO、VO等等,也提倡对实体类进行分层。至于为什么要分层,它们的理由是“避免暴露内部设计细节,只展示必要的字段”,但我个人最大的感受其实是“解耦”。我曾遇到一件无奈的事,接口已经开发完毕,前后端也联合好了,结果产品临时要大改,Service层的逻辑基本要推倒重来,连查的表都不一样了。好在得益于DTO和VO的隔离,并没有影响到其它层,前端甚至完全不知道后端全部重写了,Swagger文档也和原来一模一样...
不过个人觉得没必要去扣这些概念,比如BO、PO是啥我也记不清。一般来说,POJO分为三类即可:
- 客户端/前端传入的DTO
- 与数据库字段映射的DO
- 返回给客户端/前端的VO
也可以这样理解
- VO 是后端返给前端展示用的
- DTO 是前端传过来数据转换成后端的数据比如controller层来的各字段的数据转换成DTO,一个各个方法之间传递数据的都可以用DTO
- DO 其实就是数据库存数据时候的实体
一般都是直接使用Spring提供的BeanUtils进行数据拷贝,但它有两个问题:
- 没有提供额外的映射关系,所以两个实体类字段名必须完全一致
- 不支持深拷贝
市面上有很多比Spring的BeanUtils更强大的转换工具,比如MapStruct啥的