DO, DTO ,VO 的设计 以及优雅的转换

本文探讨了为何在项目中不应只使用DO对象,解释了DO、DTO、VO的区别,并提供了优雅地使用Dozer库进行对象转换的方法,包括在普通Java项目和JavaWeb项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:https://blog.youkuaiyun.com/zhousenshan/article/details/52904084

Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念中介绍过Java中的各种模型概念。
在这里简单再总结一下:

在日常的项目开发中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据。

很多人可能对VO和DTO并不是那么熟悉,相反对DO却比较熟悉,那是因为在很多项目中由于种种原因我们只使用了DO,原因可能有以下几种:

1、项目太小,对于一种业务实体,封装成一个DO就够了。

2、并不熟悉DTO、VO,更不知道他们之间的区别。

3、了解DO\DTO\VO之间的区别,但是懒得用。

那么,这里,博主再啰嗦一下为什么要引入这么多概念,为什么我要建议大家在自己的项目中使用这些实体对象。

为什么不能只用一个DO

我们来看这样一个例子。假如我们的项目中由User这样一个实体。我们在创建User表的时候一般包含一下属性:

针对这个实体,我们通常需要创建一个DO类,用来封装这个User实体。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class  UserDO {

    private Integer id;                 //唯一主键

    private Date createdTime;           //创建时间

    private Date updatedTime;           //最后更新时间

    private String name;                //姓名

    private Integer age;                //年龄

    private String gender;              //性别

    private String address;             //住址

    private String password;            //密码

    private String nickName;            //昵称

    private Date birthday;              //生日

    private String politicalStatus;     //政治面貌,1表示群众,2表示团员,3表示党员,4表示其他,100表示未知

    private Integer companyId;          //公司的ID

    private Integer status;             //数据状态,1表示可用,0表示不可用

 

    //setter and getter

}

然后,在代码中,从DAO一直到前端展示,我们都通过这个UserDO类的对象来进行数据传输。这样做会有什么问题嘛?

  • 不需要的字段也会传递到前端页面。
    • 如password、createdTime、updatedTime和status这几个字段我们可能在前端根本不需要展示,但是这些字段有可能也会被传递到前端(除非我们在SQL查询的时候没有查询出对应的字段)。这不仅使数据的传输量增大,还可能有安全性问题。
  • 某些字段需要转换,但是无法支持。
    • 对于上面例子中的政治面貌字段,我们在数据库中存储的是数字,但是在前端页面我要展示的是中文描述。这种情况只能在前端通过if/else的方式来分情况展示。
  • 某些字段要展示,但是并不希望出现在数据库中
    • 在User
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值