视图与DTO?VO

最近在项目需要自己创建视图,然后就来学习一下,也顺便把java中的dto的妙用又复习了一遍。

目录

视图概念入门学习与视图创建

视图与DTO?VO 


视图概念入门学习与视图创建

先来了解一下视图的概念:视图是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。

视图中有生成的规则,这个规则和我们的查询语句差不多,实际上视图就是一系列联表查询生成的逻辑表。

视图它可以展现基表(用来创建视图的表)的部分数据;单表生成的视图我们是可以修改和查询,多表查询产生的视图是不能进行数据修改的,会出现下面的弹窗:(建议如果需要修改视图中的数据,直接去创建视图的基表中修改就行)

 使用视图的好处:

  • 可以屏蔽基表中对当前业务无用的字段让查询更加高效,比如基表中有100个字段,但是我们只需要10个字段,创建并且使用这个10个字段的视图就行。

  • 可以保障表中的数据安全,使用视图的用户只能访问他们被允许查询的结果集,比如我们只希望使用这个表的用户可以查询表中的10个字段,那么我们就创建这10个字段的视图就行,这样表中的其他字段就可以不被查询的用户看见了。

  • 可以屏蔽基表结构变化对使用视图用户的影响,表中新增字段是不会影响这个视图展示的效果的。

创建视图:创建视图的各种复杂情况就不在这里赘述了,实际上创建视图的逻辑就是通过单表查询或者是多表联查产生的,所以和查询的SQL语句差不多,就是多了一些规则而已。看下面的视图的创建:

使用CREATE VIEW语句创建视图
语法格式:
CREATE [OR REPLACE] VIEW 视图名 [(列名列表)]
AS select语句
    
       
要通过视图更新基本表数据,必须保证视图是可更新视图。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。如果视图包含下述结构中的任何一种,那么它就是不可更新的:(使用视图的主要原因就是为了查询,所以对于可更新的视图这里就不在赘述了)
(1)聚合函数;
(2)DISTINCT关键字;
(3)GROUP BY子句;
(4)ORDER BY子句;
(5)HAVING子句;
(6)UNION运算符;
(7)位于选择列表中的子查询;
(8)FROM子句中包含多个表;
(9)SELECT语句中引用了不可更新视图;  

上面展示的视图的插件语句:

create or replace
algorithm = UNDEFINED view `v_t_dish_dish_flavor` as
select
    `d`.`name` as `name`,
    `d`.`price` as `price`,
    `df`.`name` as `flavorName`
from 
(
    `dish` `d`left join `dish_flavor` `df` on ((`d`.`id` = `df`.`dish_id`))
);

视图与DTO?VO 

下面是我自己在写项目的时候对dto的理解

java中有一种类叫做dto( Data Transfer Object),又称数据传输对象,主要是用来返回需要展示的数据或者是承接前端传输过来的参数用的。在展示数据这一方面和视图结合起来一起用,直接爽歪歪(当然如果项目对这种数据分层比较严格,那么与视图对应的实体类还是使用VO比较好,虽然在绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,但是二者在设计层面两者还是有着本质的区别,DTO代表服务层需要接收的数据(后端接口接收参数用)和返回的数据(返回的数据并不一定和视图对应,可能是多表联查的结果封装进来的),而VO代表展示层需要显示的数据。在需求明确,客户端只有一个的时候是没有必要将VO和DTO分开的,而在不明确而且一个展示页面可能需要多个DTO的数据组成时就可以考虑用上VO。总的来说VO主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象。然后用一个VO对象在控制层与视图层进行传输交换。)

比如:前端传了12个参数过来,需要你用接口接收,你不可能在接口的参数中写12个参数来接收吧,直接创建一个dto可能更加合适一些,dto的属性命名尽量要和前端传过来的数据的属性名一致,否则mvc进行解析映射的时候可能会出问题。

再比如:前端需要展示的数据需要从5张表查询,查询出来的结果是几十个字段,你不可能全部一个一个封装到map中吧,使用dto可能是更加好的方式。

 用伪代码来理解一下上面这段话:

前端需要展示的数据:name,age,money,house,其中name,age在user表中,money和house在 asset(资产)表中。

在实体类与数据库表的映射关系中,User实体类的name,age属性的类型要和user表中的name,age一一对应,Asset实体类中的money,house属性的类型要和asset表中的money,house一一对应。

money在asset表中是以int数据类型存储的(这里只是比喻一下,实际生产中肯定不是这样存储的),但是前端需要展示的内容是money大于100万显示为:有钱人 大于1000万显示为富豪,虽然这个前端可以直接判断来展示,但是现在需求就是要你后端来进行转换(这种数据类型的转换业务还是蛮多的,看与前端沟通的结果哈,这个前端也是可以处理的),所以在使用dto进行数据展示的时候,dto中的money就要使用string类型了。(所以这里对比一下:java中的asset实体类中的money用的int(与数据库中的asset表对应),dto中的money属性用的是string类型)

通过判断进行设置转换就行,比如 money > 1000000 就把dto中的money设置为有钱人。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值