zoukankan      html  css  js  c++  java
  • 小测试解析

    知识点: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 }
  • 相关阅读:
    记Java程序Log4J漏洞的解决过程
    IIS中应用程序池自动停止,重启报错
    如何查看域名所对应的证书有效期?
    查看前端Vue版本命令
    WCF中常见的报错:The content type text
    dotnet 将自动代码格式化机器人带入团队 GitLab 平台
    WPF 引用第三方库的控件在设计器加上设计时数据和属性
    dotnet OpenXML 聊聊文本段落对齐方式
    WPF 布局 在有限空间内让两个元素尽可能撑开的例子
    dotnet 通过 DockerfileContext 解决项目放在里层文件夹导致 VisualStudio 构建失败
  • 原文地址:https://www.cnblogs.com/tsukiyolo/p/13245791.html
Copyright © 2011-2022 走看看