前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于DO,VO,DTO,QueryParam的思考

关于DO,VO,DTO,QueryParam的思考

作者头像
benym
发布于 2022-07-14 08:56:07
发布于 2022-07-14 08:56:07
3K00
代码可运行
举报
文章被收录于专栏:后端知识体系后端知识体系
运行总次数:0
代码可运行

# 关于DO,VO,DTO,QueryParam的思考

总结一下最近项目中的一些问题

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

在项目中Do的作用域用于真正操作数据库的Dao层实现类中。

VO(View Object):视图对象,用于前端展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来

在项目中涉及到-----新增、删除、修改等操作时,作为后端Controller接口的入参对象。当针对的查询语句时,可以将查询的VO对象单独定义一个,用QueryParam作为查询对象,与基本的VO区别开来

DTO(Data Transfer Object):数据传输对象,主要用于外部接口参数传递封装,接口与接口进行传递使用

在项目中接口和接口间常常需要获取大量参数,DTO就是将这些参数封装成为一个对象,简化参数的直接传递

# 实际例子

下面用一个实际的例子展示上述几个对象在具体的开发中的作用域

本文的项目结构为如下

以一个简单的数据库为例,数据库中包含id、name、address、ctime、state五种字段,分别表示用户的id,名字,地址,数据创建事件,状态。

# POJO类设计

与之对应的DO、DTO、VO、QueryParam如下

DO:设计上需要包含所有数据库字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test.understand.pojo.domain;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import lombok.Data;

@Data
@TableName("test")
public class TestDataDO {
    @TableId
    private Integer id;

    @TableField("name")
    private String name;

    @TableField("address")
    private String location;

    @TableField(value = "ctime",fill = FieldFill.INSERT)
    private Date creatTime;

    @TableField("state")
    private Byte state;
}

DTO:用于接口间的传输,可以不同于DO传递接口间需要的参数,本文DTO和DO一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test.understand.pojo.dto;
import java.util.Date;
import lombok.Data;

@Data
public class TestDataDTO {

    private Integer id;

    private String name;

    private String location;

    private Date creatTime;

    private Byte state;
}

VO:用于页面展示,不同于DO,有些数据库字段是不必要展示的,VO可以抛弃这些字段,如本文中的id或ctime等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test.understand.pojo.vo;

import lombok.Data;

@Data
public class TestDataVO {
    private String name;

    private String location;

    private Byte state;
}

QueryParam:为了查询参数专门封装的类对象,可包含查询相关字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test.understand.pojo.query;

import lombok.Data;

@Data
public class TestDataQueryParam {
    
    private Integer id; 
    
    private String name;

    private String location;

    private Byte state;
}

# Controller

以最简单的增删改查为例。我们规定前端传输为JSON,对于增加、修改和删除来说,入参统一接收为VO对象。对于查询操作,我们规定入参统一为QueryParam对象。如下图红框所示:

# 类型转换

首先讲解saveOrUpdate方法和deleteTestData方法。

在这两个方法中,VO对象进入到Controller之后需要转化为DTO对象,因为后续他将经过Service-->ServiceImpl-->Dao-->DaoImpl,即接口之间的传输,其作用域在Controller进入之后到Mapper操作数据库之前。

转化的过程也很简单,可以利用spring提供的BeanUtils.copyProperites快速的将VO中的属性赋值给DTO对象,避免一堆set方法赋值的麻烦。

saveOrUpdate方法:

deleteTestData方法:

对于getTestDataLocation方法其入参QueryParam进入Controller之后无需转换,因为其包含查询字段,可直接通过Service-->ServiceImpl-->Dao-->DaoImpl传递。其作用域在Controller进入之后到Mapper操作完数据库之后的整个阶段。

getTestDataLocation方法:

# Service层

在service和serviceImpl层中,对DTO对象和QueryParam对象无需做对象类型转化

# Dao层

在Dao和DaoImpl的入参定义中,DTO和QueryParam统一不需要转换对象,因为还是接口之间的参数传递,但在DaoImpl中,操作数据库之前,需要将DTO对象转化为DO对象,而QueryParam可以选择用QueryWapper等包装类或者直接传输的方式交给Mapper操作。如下图红框所示

# Mapper层

mapper层用于真正操作数据库,这里采用Mybatis-plus中的BaseMapper提供的接口实现增删改,查询则通过Location查数据,重写一下对应的mapper.xml文件的sql即可

# 数据返回

增加删除修改等操作,前端往往只需要判断操作成功没有即可,所以返回值一般不是一个对象,对于非对象的传输可以直接返回。另外如查询操作,一般会涉及到分页,查出来的数据是List形式展现而从数据库查到的是DO对象,当这种操作返回值时会从Mapper-->Dao-->Service-->Controller一层一层返回回去,这时候就又变成了接口之间的参数传输了,DO对象显然不适合,所以还需转化为DTO对象。如下图红框操作所示,从DO的list转化为DTO的list作为返回值列表。

在返回值到达Controller之后,由于需要展示给前端,DTO对象还需要转化为VO对象

# 总结

  1. 除QueryParam以外,VO对象进入Controller之后需要进行对象转换变为DTO方便数据在接口中间的传递
  2. 在数据库操作之前,DTO对象需要转换为DO
  3. 在返回值的过程中,数据库返回的对象除基本类型之外需要转为DTO传递
  4. 在返回值回到Controller时,需要将DTO对象转换为VO对象,从而返回给前端
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
架构师技能1:Java工程规范、浅析领域模型VO、DTO、DO、PO、优秀命名
编程规约或者编码规范的的本质是提高了代码的可读性,最终目的是提高团队协作效率,降低工程维护成本。
黄规速
2022/04/14
4K0
架构师技能1:Java工程规范、浅析领域模型VO、DTO、DO、PO、优秀命名
Java中Vo类的理解
答案是因为在复杂的业务逻辑中,往往单一实体类无法满足我们的需求,就举个简单的例子,一个课程系统中有一级分类和二级分类,那么一个一级分类应该会对应多个二级分类,如果我们使用二级菜单的话,就应该可以实现这种联动的效果,一旦一级菜单确定下来了,那么二级菜单的下拉项中的选项只能是一级菜单下的二级菜单,也许有点绕 发证大意就是需要做到 一对多
Tom2Code
2022/11/21
3.1K0
Java中Vo类的理解
【畅购商城】订单模块之显示勾选商品和添加订单
目录 显示勾选商品 添加订单 接口:下订单 ​​​​​​​接口:更新库存 ​​​​​​​下订单分析 ​​​​​​​后端实现:JavaBean​​​​​​​ ​​​​​​​后端实现:更新库存 后端实现:下订单 ​​​​​​​前端实现 显示勾选商品 步骤一:页面加载成功,查询已经勾选商品 async mounted() { // 查询收获人地址 this.getAddressFn() //2 查询需要购买的物品 let { data : cart } = await
陶然同学
2023/02/24
6410
【畅购商城】订单模块之显示勾选商品和添加订单
黑马瑞吉外卖之菜品的分页查询展示(难点)
没有开发分页查询之前,数据是不能正确展示出来的。现在我们就需要实现这儿分页查询的功能。
兰舟千帆
2022/09/27
8960
黑马瑞吉外卖之菜品的分页查询展示(难点)
带你多种方法实体类转换 玩转VO,PO,DTO 之间转换
随着互联网的发展,前后端分离的开发模式越来越流行。在前后端数据交互过程中,为了保证数据的安全性和效率,通常会采用 DTO 和 VO 来封装数据。
用户10143704
2024/04/20
2.3K0
黑马瑞吉外卖之套餐信息的分页查询
首先这里是套餐的功能开发,我们在设置数据库表以及之后的实体类的时候我们需要关注的就是套餐本身的分类以及套餐下关联的菜品。
兰舟千帆
2022/09/29
3690
黑马瑞吉外卖之套餐信息的分页查询
springboot+vue练手级项目,真实的在线博客系统
Spring常用注解,注解 IOC ,AOP,MVC 的理解 mybatisDao层 Mapper层 controller层 service层 model层 entity层 简介 mall商场学习文档 mybatisplus学习文档 mybatisplus配套代码 easycode搭配mybatisplus巨爽 @Autowired 的时候为什么注入接口不是实现类 @Service注解为什么是标注在实现类上的 mapper接口需要加注解吗?通过MapperScan减少注解 @Mapper与@MapperScan注解的作用是什么?
全栈程序员站长
2022/11/03
1.4K0
基于Springboot+MybatisPlus的外卖项目瑞吉外卖Day3
1、在实体类的属性上加入@TableField注解,指定自动填充的策略 2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectMapper接口
小小程序员
2023/03/27
4710
基于Springboot+MybatisPlus的外卖项目瑞吉外卖Day3
DTO、TO、VO、PO、DO、BO、AO、DAO、POJO
之前一直有朋友问我Java中DTO、TO、VO、PO、DO、BO、AO、DAO、POJO这么多O到底是什么意思,看博客看不懂,有没有实际的例子
阿超
2022/08/16
1.5K0
有了这个,SQL语句都不用写了
MyBatis-Puls在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
千羽
2021/01/14
7730
有了这个,SQL语句都不用写了
基于Springboot和MybatisPlus的外卖项目 瑞吉外卖Day4
​ **文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上.**文件上传时,对页面的form表单有如下要求:method=“post” enctype=“multipart/form-data” type=“file”
小小程序员
2023/03/27
4990
四.SpringBoot配置MyBatis-Plus
mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb
十分钟空间
2022/08/17
8110
四.SpringBoot配置MyBatis-Plus
PO、VO、BO、DO、DAO、DTO、POJO
在实际编码过程中,将这些术语应用到项目中需要遵循一定的规范。例如,PO(持久化对象)通常用于表示与数据库交互的对象,VO(值对象)用于传递简单的值,BO(业务对象)处理业务逻辑,DO(领域对象)表示领域模型,DAO(数据访问对象)处理数据访问,DTO(数据传输对象)管理数据传输,而POJO(普通旧Java对象)则是简单的Java对象。
默 语
2024/11/20
1370
一篇文章带你掌握MyBatis简化框架——MyBatisPlus
类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人大大也开发了一款MyBatisPlus框架用来简化MyBatis开发
秋落雨微凉
2022/10/25
7100
一篇文章带你掌握MyBatis简化框架——MyBatisPlus
MyBatis-Plus的使用
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。
后端码匠
2020/11/06
6590
MyBatis-Plus的使用
entity、bo、vo、po、dto、pojo如何理解和区分?
Java开发过程中,基本实体类包都以entity或者model来称呼,可是不少项目中,却以Bo、Vo来命名,面试的时候,也有可能被问到这些问题。那么,这几者分别代表什么意思呢?
Erwin
2020/05/14
4.9K0
什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?
在Java开发中经常遇到这些概念问题,有的可能理解混淆,有的可能理解不到位,特此花了很多时间理顺了这些概念。不过有些概念实际开发中并没有使用到,可能理解还不够准确,只能靠后续不断纠正了。
全栈程序员站长
2022/09/01
4K0
Java中的VO,PO等1.2.3.VO(value object) 值对象
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。 通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。 在O/R Mapping的世界里,有两个基本的也是重要的需要了解,即VO,PO。 VO,值对象(Value Object) PO,持久对象(Persisent Object) 它们是由一组属性及其get/set组成。从结构上看,它们并没有什么不同的地方。但从其意义和本质上来看是完全不同的。 1. VO new关键字创建,由GC回收 P
JavaEdge
2018/05/16
1.9K0
SpringBoot项目拥抱Mybatis-Plus持久层框架实践,全面提升数据库层面开发效率!
自从 Mybatis-Plus推出以来,越来越多的公司在自己的项目中选择Mybatis-Plus框架替换了持久层框架Mybatis。因为Mybatis-Plus用起来既有Mybatis的手写复杂sql语句的灵活性,又兼具了Spring Data Jpa自动提供了单表CRUD操作的通用框架方法,只需要自定义一个Mapper并继承BaseMapper即可,为开发人员使用持久层框架节约了很多工作量。同时Mybatis-Plus还提供了链式查询和分页查询等诸多通用API方法,开发人员可直接使用。本文的目的是指导新手如何在自己的spring-boot项目中集成mybatis-plus持久层框架完成数据的增删改查功能。
用户3587585
2021/12/07
1.9K0
SpringBoot项目拥抱Mybatis-Plus持久层框架实践,全面提升数据库层面开发效率!
基于Springboot和mybatis的外卖项目瑞吉外卖Day5
​ 将新增页面录入的套餐信息插入到setmeal表,同时向setmeal_dish表插入套餐和菜品关联数据。
小小程序员
2023/03/31
2480
推荐阅读
相关推荐
架构师技能1:Java工程规范、浅析领域模型VO、DTO、DO、PO、优秀命名
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验