数据库复习四---理论知识的复习
1.表和视图的关联和区别
表是什么?视图又是什么?
表:是在数据库中最重要的对象,是数据库的基础,是基本的存储单元,用来存储数据,由行和列组成的。其中每一行表示一条记录常常对应java中的一个实例对象,每一列代表一个字段常常对应java的一个实例的一个属性。
数据库表和字段命名规则:
必须以字母开始;必须是1~30字符长度;只能包含字母、数字、_、$、#;不能使用Oracle关键字;同一个用户所拥有的的对象之间不能重名。
数据库中的表的类型是:用户表和数据库字典表。
视图:是表现数据的逻辑子集或数据的组合。视图是基于表或另一个视图的逻辑表,一个视图并不包含真实的数据,它提供了另一个视角查看或改变表中的数据。有些视图本质上是一个SQL语句的结果集。
由上面的视图和表的基本的概念,我们可以得知二者的关联和区别:
二者的联系:“视图是基于表或另一个视图的逻辑表”由此可知视图是基于表上建立的表,其结构都是基于表的。它依赖于基本表存在,一个视图可以对应一个基本表,也可以对应多个基本表,视图是基本表的抽象和逻辑上建立的新关系。
二者的区别:
1>、视图是已经编译好的sql语句。而表不是
2>、视图没有实际的物理记录。而表有。
3>、表是内容,视图是窗口
4>、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5>、表是内模式,视图是外模式
6>、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7>、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8>、视图的建立和删除只影响视图本身,不影响对应的基本表。
因为区别有许多,难以记忆,但是其区别没有离开二者的基本概念,都是基于二者的基本概念展开论述的。
2.简述索引、序列
索引是数据库对象,通过指针的形式提高查询的速度。需要说明的是索引创建的一般规则:
索引的创建主要是用来提高查询的速度的,所以当数据库需要高频率的查询,可以考虑创建索引,即使确定使用索引仍需要考虑创建索引所带来的开销,比如较小的表格就不需要创建索引了。
序列是产生一系列唯一数字的数据库对象。主要用于创建主键值。
3.简述some、any、all、union、union all的用法。
some与any的用法相同。
any的用法是:只要有一条数据满足条件,整个条件成立。
all的用法是:必须所有的数据都必须满足条件,整个条件成立。
union的用法是:SQL1 union SQL2 这是union关键字的语法。union操作符是用来合并两个或多个select语句的结果集,需要注意的是SQL语句的结果集必须有相同数量的列,列的顺序必须相同,union默认是去重的,如果要显示重复的数据则可以使用关键字union all。
4.SQL漏洞注入
SQL漏洞注入发生的场景是:常见是在登陆、留言板界面。
发生的原因是:字符过滤的不严谨造成的,可以得到管理员的账号密码等资料。
SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击
发生的方式是:比如在登陆界面,需要我们输入用户名和密码。对应的验证的SQL语句是:
select * from users where userName='a' and passwd='123';
注入攻击:
select * from users where userName='a' or 1=1 and passwd='123' or 1=1;
或者
select * from users where userName='a' -- and passwd='123' ;
再或者加上分号:; 用来结束SQL语句。
分析其特点是:上述的用户的在表单中的输入直接用来构造动态的SQL命令。黑客常常会在表单输入的过程中加入恒等式(or 1=1)、注释符(--)、SQL结束符(;)来恶意的破坏动态SQL命令的执行。
解决的方法是:就上面出现的情况就是将这些非法字符过滤掉,我在了解到该情况后,就随机试了几个登陆网站的登陆页面,使用的方式是恒等式,有的在输入用户名时就会报错。这说明是在格式校验时就过滤了。
5.JDBC连接的步骤(面试重点)
JDBC是什么?
JDBC是java数据库连接,是一种用于执行SQL语句的API。
1>加载驱动类
2>获的连接对象Connection对象
3>创建执行SQL语句的Statement对象
4>执行SQL语句
5>处理结果集
6>关闭连接
6.数据库连接池的原理及常见的数据库连接池的性能比较。
数据库连接池产生的原因是因为数据库连接是昂贵的,有限的资源,对数据库连接的管理是对整个应用程序的健壮性、伸缩性影响是非常大的。数据库连接池就是因此产生的。
数据库连接池的原理是:
在系统初始化时,数据库连接作为对象存储到内存中,当用户访问数据库时,从数据库连接池中取出一个闲时已创建的数据库连接对象。使用完毕后,再将数据库连接放回数据库连接池中,以供下一个用户请求使用。而数据库的连接、断开是由数据库连接池自己管理的。可以通过设置来数据库连接的初始化数量、连接的上下线数、每个连接使用的最大次数、最大空闲时间、监视数据库连接的数量及连接的使用情况。
简单的总结为:用时取,不用就放回。自己管理,可以设置。
数据库连接池:dbcp、c3p0、proxool
性能评价:
dbcp: 在具体的项目应用中持续运行的性能还可以,速度稍慢,在大并发量下压力下稳定性下降,不提供连接池监控。
c3p0:在具体项目中持续运行的性能比dbcp要好,在大并发量压力下稳定性也有一定的保证,也不提供连接池的监控。
proxool:在具体项目中其突出的优点就是能对连接池监控,常在开发测试阶段使用,但是其性能不如上面的两者。
综合下来就这三种数据库连接池而言,推荐使用c3p0,其持续性能和大并发压力稳定性能都较好。但是在开发的测试阶段可以考虑是proxool,其具备监控连接池的功能,有助于确定连接是否断掉从而确定是否是代码的性能问题。
7.简述事务
数据库是一种机制,是一组操作序列,包含一组数据库的操作命令,这组操作命令要么全部执行,要么全部都不执行。由此可知事务是一个不可分割的逻辑单元。在数据库系统上执行并发操作时事务作为最小的控制单元来使用。
事务具有的属性(四性非常重要):
原子性:事务是一个完整的操作。
一致性:当事务完成后数据必须处于同一状态。
隔离性:对数据进行修改的所有并发事务必须是相互隔离的
持久性: 事务后,对于数据库作用在时间上是永久的。
在刚一接触时,会忘记提交事务。比如:在创建完一个表格后就需要提交事务。在DOS端输入命令:commit
8.简述Oracle触发器。
触发器是数据库对象的一种,是一个特殊的过程,所以说,触发器类似函数和过程。是在事件发生时隐式的自动运行的PL/SQL程序块,不能插入参数,不能被调用。注意此处所表述的就已经能够看出Oracle触发器的具体表现形式是一段PL/SQL程序块,执行的条件是事件发生时。
9.存储过程
存储过程是一组完成特定功能的SQL语句记录集,存储在数据库中,经过第一次编译后再次调用不许要编译,用户通过指定存储过程的名字和参数来执行它。存储过程是数据库重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程的优点:
1.可以模块化程序设计,也就是只需要创建一个过程,以后在程序中就可以调用任意次;
2.可以更快执行,如果某操作需要执行大量的SQL或重复执行,存储过程比SQL语句执行的更快;
3.减少网络流量,例如一个需要数百行的SQL代码操作有一条执行语句完成,不需要再网络中发送数百行代码;
4.更好的安全机制,对于没有权限执行存储过程的用户,也可以授予他们执行存储过程.