小测试解析
知识点:xml corejava 数据库 jdbc
以下为部分解析,在这里记录下,后续慢慢更新。如有问题,望指正,不胜感激!
一、选择题
1.为了考虑数据的安全性,要求每个教师只能存取自己讲授的课程的学生成绩,应该创建___
A.索引 B.视图 C.游标 D.表
解析:
- 视图:视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如
- 在表中增加一个标志用户名的列;
- 建立Oracle视图,是用户只能看到标有自己用户名的行;
- 把视图授权给其他用户。
-
索引:在检索数据时不进行全表扫描,只通过某一列的索引即可快速定位数据记录在存储设备上的位置,从而大大加快检索速度。
-
游标:从表中检索出结果集,从中每次指向一条记录进行交互的机制。
- 指定结果集中特定行的位置
- 基于当前的结果集位置检索一行或连续的几行
- 在结果集的当前位置修改行中的数据
- 对其他用户所做的数据更改定义不同的敏感性级别
- 可以以编程的方式访问数据库
2.关于类型定义Number(9,3)说法正确的是 (整数部分6位,小数部分3位,共9位)
解析:oracle基本数据类型:
1.char(n):定长字符串,n字节长,如果不指定长度,缺省 为 1个字节长(一个汉字为2字节)
2.varchar2(n):可变长的字符串,具体定义时指明最大长度n, 这种数据类型可以放数字、字母以及ASCII码字符集。
3.number(m,n):可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。
4.date:缺省格式为DD-MON-YY
5.大数据blob clob nclob:用来保存较大的图形文件或带格式的文本文件
3.获取当前系统时间的查询语句是 (Select sysdate from dual;)
总结:ORACLE里获取一个时间的年、季、月、日的函数,dual是虚表
select to_char(sysdate, 'yyyy' ) from dual; ---年
select to_char(sysdate, 'MM' ) from dual; ---月
select to_char(sysdate, 'dd' ) from dual; ---日
select to_char(sysdate, 'Q') from dual; ---季
4.在数据库中可以创建和删除表、视图、索引,可以修改表。这是因为数据库管理系统提供了__
A. DDL B. DML C. TCL D. DCL
总结:
DDL (Data Definition Language )数据库定义语言 :可以进行 CREATE 、ALTER 、DROP 、TRUNCATE 、COMMENT 、RENAME
DML (Data Manipulation Language)数据操纵语言 ,需要commit事务,可以增删改
TCL(Transaction Control Language)事务控制语言 :SAVEPOINT 设置保存点 、ROLLBACK 回滚 、commit提交事务
DCL(Data Control Language)数据库控制语言 , 授权,角色控制等
GRANT 权限 to 用户名
REVOKE 权限 from 用户名
5.下面所列条目中,哪一条不是标准的SQL语句?
A. ALTER VIEW B. ALTER TABLE C. CREATE TABLE D. CREATE VIEW
总结:oracle sql与标准的sql语句的区别:
1、Oracle对于外连接操作可以使用(+);标准SQL用join on语法。
2、Oracle提供专门的系统变量sysdate;标准SQL没有。
3、Oracle提供特有的转换函数,例如:to_char,to_date,to_number等等;标准SQL没有。
1、创建视图
create view 视图名 as select 语句 [with read only]
2、创建或修改视图
create or replace view 视图名 as select 语句 [with read only]
3.删除视图
drop view 视图名
6.数据库的并发操作可能带来的问题包括 (丢失更新)
7.下列不属于Oracle数据库中的约束条件的是____
A. Unique(唯一性) B. NOT NULL(非空) C. INDEX(索引) D. Primary key(主键)
8.在Oracle中,有一个教师表teacher的结构如下:
ID NUMBER(5)
NAME VARCHAR2(25)
EMAIL VARCHAR2(50)
显示没有Email地址的教师姓名 select name from teacher where email is null;
9.典型的jdbc程序按________顺序编写(DBECFA)
A.释放资源
B.获取与数据库的物理连接
C.执行Sql语句
D.注册jdbc driver驱动
E.创建不同类型的statement
F.如果有结果集,处理结果集
10.在Oracle中,下面哪条语句当COMM字段为空时显示0,不为空时显示COMM的值
select ename,nvl(comm,0) from emp;
解析:nvl(m,n)函数处理空值,在oracle中空值与任何其他的值运算都是为空,m为不是空值所要运算的值,n为如果空值,用n来替换计算。
NVL:格式:NVL( string1, replace_with)
功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
注意事项:string1和replace_with必须为同一数据类型,除非显式的使用TO_CHAR函数进行类型转换。
11.在Oracle中,有一个名为seq的序列对象,以下语句能返回序列值但不会引起序列值增加的是_
A. select seq. CURRVAL from dual;
B.
select seq.ROWID from dual;
C. select seq. ROWNUM from dual;
D.
select seq.NEXTVAL from dual;
总结:
seq.ROWNUM :按设定排序的行的序号, 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说ROWNUM是符合条件结果的序列号。它总是从1开始排起的。使用ROWNUM时,只能使用<、<=、!=符号。
seq.ROWID :返回行的物理地址,快速删除重复的记录
seq.CURRVAL:返回 sequence的当前值
seq.NEXTVAL:增加sequence的值,然后返回 sequence 值
12.有表一的查询结果如下,该表为学生成绩表:
select id,grade from student_grade
ID GRADE
-------- -----------
1 50
2 40
3 70
4 80
5 30
6 90
表二为补考成绩表
select id,grade from student_makeup
ID GRADE
-------- -----------
1 60
2 80
5 60
现在通过如下语句把补考成绩更新到成绩表中,并提交:
update student_grade s set s.grade =
(select t.grade from student_makeup t
where s.id=t.id);
commit;
请问之后查询:
select GRADE from student_grade where id = 3;结果为_______________
A. 0
B. 70
C. Null
D.以上都不对
解析:修改语句是把二个表学号相同的同学修改成绩为student_makeup表,而该表中只有1,2,5学生有成绩,其他的学生没有成绩为空值。
13.在Oralce中获取前10条的关键字是(rownum)
14.下面程序的运行结果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println((str1 == str2)&(str1.equals(str2)));
A、编译报错
B、null
C、false
D、true
解析:==比较的是内存地址,equals比较是内容是否相同。str2的he和new String(“llo”)相当于开辟了二个内存空间,所以str1==str2为false,&符必须二个都相同才为true,故结果为false。
15.SQL语言按照用途可以分为三类,不包括下面选项中的( )。
A. DQL (数据查询语言) B. DCL C. DML D. DDL
16.字符流与字节流的区别是()
A、每次读入的字节数不同
B、前者带有缓冲,后者没有
C、前者是块读写,后者是字节读写
D、二者没有区别,可以互换使用
17.下列关于PreparedStatement对象的说法错误的是___________
A PreparedStatement对象继承了Statement对象
B PreparedStatement可以有效的防止sql注入
C PreparedStatement不能用于批量更新操作
D PreparedStatement可以存储预编译的Sql,从而提升执行效率
18.使用sql查询时,使用where子句指出的是 查询条件
19. 哪几种是预定义实体的正确引用 ()
A. <
B. lt;
C. &root;
D. &cool;
解析:  空格 < 小于号 >大于号
20. select ceil(-97.342), floor(-97.342), round(-97.342), trunc(-97.342) from dual;
下列哪个函数不返回结果-97?
A.ceil() B.floor() — -98 C.round() D.trunc()
解析:
1.1trunc函数处理数字,trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去
其具体的语法格式如下:TRUNC(number[,decimals])
其中:
number 待做截取处理的数值
decimals 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分。
注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。与取整类似,比如参数为1即取整到十分位,如果是-1,则是取整到十位,以此类推;如果所设置的参数为负数,且负数的位数大于或等于整数的字节数的话,则返回为0。如:TRUNC(89.985,-3)=0。
1.2trunc函数处理日期,trunc函数返回以指定元元素格式截去一部分的日期值。
其具体的语法格式如下:TRUNC(date,[fmt])
其中:
date为必要参数,是输入的一个日期值
fmt参数可忽略,是日期格式,用以指定的元素格式来截去输入的日期值。忽略它则由最近的日期截去
下面是该函数的使用情况:
trunc(sysdate,'yyyy') --返回当年第一天.
trunc(sysdate,'mm') --返回当月第一天.
trunc(sysdate,'d') --返回当前星期的第一天.
selecttrunc(sysdate,'YYYY')from dual;
selecttrunc(sysdate,'MM')from dual;
selecttrunc(sysdate,'D')from dual;
2.round函数(四舍五入),描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果。
SELECT ROUND( number, [ decimal_places ] ) FROM DUAL
参数:
number : 欲处理之数值
decimal_places : 四舍五入 , 小数取几位 ( 预设为 0 )
select round(123.456, 0) from dual; 回传 123
select round(123.456, 1) from dual; 回传 123.5
select round(-123.456, 2) from dual; 回传 -123.46
3.ceil和floor函数,ceil和floor函数在一些业务数据的时候,有时还是很有用的。
ceil(n) 取大于等于数值n的最小整数;
floor(n) 取小于等于数值n的最大整数
二、填空题
1.使用SELECT语句显示当前系统时间,显示格式为如:2009-03-25 20:13:43
select to_char(sysdate,’yyyy-MM-dd hh24:mi:ss’) __from dual;
2. 数据库事务的特性 原子性、隔离性、持久性、一致性
3. 执行脚本estore.sql文件的两种方式 @estore.sql 、start estore.sql
4. 请写出两种清空表order中数据的方法
1) delete from order 2) truncate table order
哪一种方式是彻底删除数据___truncate______
5.JDBC编程中负责事务管理的类是____Connection____,Mybatis编程中负责管理事务的类是______SqlSession_____;
6.设置name列显示长度为20个字符 col name format a20; 设置salary列显示格式为$23,200.00 col salary format $99,999.00 ;
7.oracle通配符: “ _ ” 代表:占位符,代表任意一个字符; “ % ” 代表通配符,代表0个或任意个字符,转义字符 : escape
8.以练习的s_emp表,写出查询用户的last_name第二个字符为"g"的所有信息的查询语句 select * from s_emp where last_name like ‘_g%’; 写出查询last_name 首字母大写的用户查询语句 select * from s_emp where substr(upper(last_name),0,1) = substr(last_name,0,1);
9.oracle数据库字符函数的substr(‘hello world’,3,5)操作的结果是:llo w
substr(‘hello world’,3,5)表示,从第三个字符开始取,取五个字符。
10.写出在oracle数据库删除一个nice用户的语句 drop user nice cascade; 给新创建用户赋于权限语句 grant 权限(角色) to 用户;
三、简答题
1. 请简述JDBC注册驱动的三种方式
1) 反射机制,参数传入要注册的驱动类全限类名;Class.forName(driverName);
2) 直接创建驱动类对象,加载数据库驱动;New OracleDriver();
3) 在系统参数中加入驱动类的全权类名,JVM启动参数全部都保存在System类当中的一个Properties对象中,可以把驱动类名添加到这个Properties对象中。
System.setProperty(“jdbc.drivers”,driverName)
2. Dom解析 与 Sax 解析它们的优缺点是什么
DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成各个Node对象(节点),基于内存的一种解析方式。
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点:如果文件比较大,内存有压力,解析的时间会比较长
SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,基于事件解析的一种方式。
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改
3.以练习的S_emp,S_dept表为基表,查看和Ngao所在部门的区域id一样的所有员工id和名字(5分)
select e.id,e.last_name
from s_emp e,s_dept d where
d.region_id=(
select d.region_id from s_emp e,s_dept d where
e.dept_id=d.id and last_name='Ngao')
and e.dept_id=d.id ;
4. 以练习的S_emp,S_dept表为基表,查询每一个部门的员工小于该部门的平均工资的员工的信息?
Select last_name,salary,s_emp.dept_id ,avg
from s_emp,(
Select avg(salary) avg,dept_id
from s_emp
group by dept_id) a
Where s_emp.dept_id=a.dept_id and salary<avg;
5.列出五中常见的Exception
NullPointException 空指针异常
ArrayIndexOutOfBoundsException 数组下标越界
FileNotFoundException 文件找不到
ClassCastException 类型转换异常
ClassNotFoundException 类加载异常
6.请简述Statement对象和PreparedStatement对象的关系和区别
关系:PreparedStatement继承自Statement, 他们属于父与子的关系。使用上来说Statement使用的地方都可以换成PreparedStatement。
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高 ,Statment无法预防SQL注入 。Statement可以执行任何SQL命令,通常用来执行异构的SQL命令。 PreparedStatement用来执行同构的SQL命令效率非常高。
Statement的直接执行SQL语句,无法防止SQL注入问题。PreparedStatement可以使用占位符,可以防止SQL注入问题。
PreparedStatement:
1) addBatch()将一组参数添加到PreparedStatement对象内部。
2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
Statement:
1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句。
2) executeBatch()执行批处理缓存中的所有sql语句。
五、编程题
1.请写出一个单例模式的例子
1.构造器私有化
2.需要有一个,暴露在外边的接口(静态方法),该方法的返回值为当前类对象
在什么时候创建?
饿汉模式:声明时候创建.
懒汉模式:用的时候创建.
反射攻击单例---> 通过反射拿到单例类中的构造器,然后创建对象
单例模式中的构造器(有且只调用一次,只new一次)
---整个静态参数 ,默认为0,调用一次+1,同过反射调用构造器时(第二次了),当时参数为2,if(i<=1){throw Exception()}
详细代码:
1 /* 2 * 写出一个单例模式的例子---懒汉模式 3 */ 4 public class Singleton { 5 private static Singleton instance; 6 7 private Singleton() { 8 9 } 10 11 public static Singleton getInstance() { 12 if(instance == null) { 13 instance = new Singleton(); 14 } 15 return instance; 16 } 17 }
2. 数据库中有Student表,以下为建表语句。请将学生A的信息保存入数据库中,要求使用JDBC技术,将此记录插入student表中。学生A信息为:学号:001;姓名:张三;生日:2012年1月12号。
create table student(
id number(3) primary key,
name varchar2(20),
birthday date );
详细代码:
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 /* 5 * 学生A信息为:学号:001;姓名:张三;生日:2012年1月12号 6 * 插入表格中 7 */ 8 public class SaveTest { 9 public static void main(String[] args){ 10 try { 11 // 注册驱动 12 Class.forName("oracle.jdbc.driver.OracleDriver"); 13 // 获取连接 14 String url = "jdbc:oracle:thin:@localhost:1521:xe"; 15 String user = "briup"; 16 String password = "briup"; 17 Connection conn = DriverManager.getConnection(url, user, password); 18 // 创建执行sql语句对象 19 String sql = "insert into student values(?,?,to_date(?,'yyyy-mm-dd'))"; 20 PreparedStatement pst = conn.prepareStatement(sql); 21 // 执行sql 22 pst.setInt(1, 1); 23 pst.setString(2, "张三"); 24 pst.setString(3, "2012-01-12"); 25 if(pst.executeUpdate() != 0) 26 System.out.println("插入成功!"); 27 // 关闭资源 28 if (pst !=null) { 29 pst.close(); 30 } 31 if(conn != null) { 32 conn.close(); 33 } 34 System.out.println("连接已释放!"); 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 } 39 }
数据库查询:
1 SQL> create table student( 2 2 id number(3) primary key, 3 3 name varchar2(20), 4 4 birthday date ); 5 6 表已创建。 7 8 SQL> select * from student; 9 10 ID NAME BIRTHDAY 11 ---------- ---------------------------------------- -------------- 12 1 张三 12-1月 -12
3.编写PictureClient.java、PictureServer.java和PictureThread.java文件,功能是用多线程实现将一张图片从客户端(PictureClient.java)上传至服务端(PictureServer.java),多线程是指服务端一直在运行,等待客户端的消息,当有多个客户端同时上传图片时,服务端要能同时处理多个客户端,须考虑程序在运行过程中可能出现的异常。
服务器:
1 import java.net.ServerSocket; 2 import java.net.Socket; 3 4 import com.briup.test.PictureThread; 5 6 public class PictureServer { 7 8 private static int port = 8088; 9 10 public static void main(String[] args) { 11 try { 12 System.out.println("服务器端开启成功"); 13 ServerSocket ss = new ServerSocket(port); 14 // 支持多并发的服务器 15 while(true) { 16 Socket socket = ss.accept(); 17 new PictureThread(socket).start();; 18 } 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 } 23 }
线程:
1 import java.io.BufferedInputStream; 2 import java.io.File; 3 import java.io.FileOutputStream; 4 import java.io.OutputStream; 5 import java.net.Socket; 6 7 public class PictureThread extends Thread{ 8 private Socket socket; 9 private String path; 10 11 public PictureThread(Socket socket) { 12 this.socket = socket; 13 } 14 15 @Override 16 public void run() { 17 String hostAddress = socket.getInetAddress().getHostAddress(); 18 System.out.println(hostAddress + "来啦"); 19 try { 20 // 通过网络流,将客户端上传的图片接收,同时将图片保存到xxx位置 21 BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); 22 path = "src/com/briup/test/copy.jpg"; 23 FileOutputStream fos = new FileOutputStream(new File(path)); 24 byte[] buf = new byte[1024]; 25 int i = -1; 26 while((i = bis.read(buf)) != -1) { 27 fos.write(buf, 0, i); 28 } 29 // 向客户端返回消息,将图片保存成功 30 OutputStream os = socket.getOutputStream(); 31 os.write("图片上传成功!!!".getBytes()); 32 // 关闭资源 33 if(fos != null) 34 fos.close(); 35 if(socket != null) 36 socket.close(); 37 } catch (Exception e) { 38 System.out.println("上传失败"); 39 e.printStackTrace(); 40 } 41 } 42 43 }
客户端:
1 import java.io.BufferedInputStream; 2 import java.io.BufferedOutputStream; 3 import java.io.FileInputStream; 4 import java.net.Socket; 5 6 public class PictureClient { 7 8 static String host = "127.0.0.1"; 9 static int port = 8088; 10 private static String path; 11 12 public static void main(String[] args) { 13 // 从本地拿文件(用普通的流) 14 // 上传到服务器(网络输出流) 15 try { 16 System.out.println("这是客户端"); 17 Socket client = new Socket(host, port); 18 path = "src/com/briup/test/p1.jpg"; 19 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path)); 20 BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream()); 21 byte[] buf = new byte[1024]; 22 int i = -1; 23 while((i = bis.read(buf)) != -1) { 24 bos.write(buf, 0, i); 25 } 26 // 关闭网络输出流 27 client.shutdownOutput(); 28 // 接收数据库返回消息(上传是否成功) 29 BufferedInputStream toServer = new BufferedInputStream(client.getInputStream()); 30 byte[] server = new byte[1024]; 31 int read = toServer.read(server); 32 System.out.println(new String(server, 0 ,read)); 33 // 关闭资源 34 if(bis != null) 35 bis.close(); 36 if(client != null) 37 client.close(); 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } 41 } 42 }