小测试解析

知识点: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. &lt;         

  B. lt;       

  C. &root;       

  D. &cool;

解析:&nbsp 空格  &lt 小于号  &gt大于号

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 }
posted @ 2020-07-05 13:12  Tsuki_y  阅读(964)  评论(0编辑  收藏  举报