JDBC问答题

JDBC考试题:

一,JDBC的全称是什么,有什么作用?

答:Java DataBase Connectivity.
jdbc是java提供给数据库厂商的接口,实现了接口的数据库就可以通过jdbc api与java代码连接.
使用jdbc,通过相应的数据库驱动与数据库连接后,就可以使用jdbc执行sql语句,操作数据库.
jdbc将数据库与java代码隔离开,这样即使更换了数据库,也只需要更改注册的驱动,而不需要更改其他的java代码.

二,使用jdbc注册驱动时,为什么不推荐使用一号代码,推荐使用二号代码?

一号:DriverManger.register(new com.mysql.jdbc.Driver());
二号:Class.from(“com.mysql.jdbc.Driver”);
- 答:在com.mysql.jdbc.Driver这个类中,存在一个静态代码块,在静态代码块中就已经执行了一号代码.
- 当Driver类被加载进内存时,就会执行一遍静态代码块,也就执行了一次一号代码.
- 所以如果在注册驱动时直接使用一号代码,一号代码中new Driver()的操作就会加载Driver类,加载的时候又执行了一次一号代码.
- 这样实际上就注册了两次,浪费内存,所以推荐使用二号代码.

三,使用JDBC的五步操作都是什么?

  • 1,注册驱动

  • 2,获得连接对象

  • 3,获得Statement/PrepareStatement对象

  • 4,执行SQL语句

  • 5,关闭资源

  • 四,execute(),executeUpdate(),executeQuery()方法的返回值都代表什么意思?

  • 1,execute()方法的返回值:

  • 如果执行sql语句得到了结果集,则返回true;

  • 如果得到的是受影响的行数或什么也没得到,则返回false;

  • (也可以直接说没得到结果集返回false,只不过前面的说法能表明你知道执行sql还能得到什么)

  • 2,executeUpdate()方法的返回值:

  • 执行sql语句后,数据库中受影响的行数

  • 3,executeQuery()方法的返回值:

  • 是一个ResultSet对象,执行查询语句后得到的结果就被封装在这个ResultSet对象中.即使什么都没查到,ResultSet对象也不为null,只是该对象中没有内容而已.

  • 五,如何遍历ResultSet对象?next()方法在做什么?

    while(resultSet.next()){
        String xxx = resultSet.getString("xxx列");
    }
  • 在resultSet中,封装了一个类似指针的东西,刚开始这个指针指向的是0位置,当调用next()方法时,就会将指针移动到1位置,如果1位置有值,则next()方法会返回true,无值也就返回false,返回false就跳出循环了.

  • 六,为什么推荐使用PrepareStatement,有什么优点?

  • 1,防止SQL注入:如果接收用户传递过来的参数,通过statement对象执行的sql语句为下面的:

    String sql = "select * from user where name='"+name+"'";

  • 而用户输入的name参数为下面的:

    String name="k' or '1'='1'";
  • 那么执行该sql语句就可以查询到user表中的所有内容,这显然跳出了我们的安全限制,这种操作就叫做SQL注入.

  • PrepareStatement对象可以防止SQL注入,因为该对象会将接收到的参数,不管参数中是否含有单引号等会影响sql语句结构的符号,都将该参数作为一个整体与name这个判断条件判断.

  • 原理是PrepareStatement会将’转义成\’

  • 2,PrepareStatement对象采取的是预编译形式,会先将sql语句编译好交给数据库,执行的时候就直接执行可以了,方便更改参数复用,效率高速度快,而Statement每次执行都会重新编译一次sql语句.

  • 七,DBUtils的核心类是哪个类?使用该类的常规操作是什么?

  • QueryRunner类是核心类

  • 1,创建QueryRunner对象

  • 2,创建连接对象

  • 3,创建要执行的sql语句字符串对象

  • 4,将连接对象与sql字符串对象传入到QueryRunner操作数据库的增删改方法中.

  • 5,如果执行的是查询方法,还可以使用ResultSetHandler的实现类对象.

  • 6,如果sql中有参数,可以直接在QueryRunner的方法中将参数传入进去,QueryRunner操作数据库的方法接收的是一个Object类型的可变参数.

  • 八,简述创建对象时子类的方法与父类方法的执行顺序

    class Animal{}
    class Cat extends Animal{}
    Cat cat = new Cat();
  • 1,先加载父类Animal的静态代码块和静态属性

  • 2,再加载子类Cat的静态代码块和静态属性

  • 3,执行父类的构造方法

  • 4,执行子类的构造方法

  • 九,谈谈你对多态的理解

  • 主要就记住这两句话:

  • 1,父类的引用指向了子类的对象

  • 2,一个对象可以有多种表现形态

  • 十,QueryRunner类的查询方法会接收一个叫ResultSetHandler接口类型的对象,说出三种该类型的实现类,浅谈该接口存在的意义.

    1)BeanHandler: 查询返回单个对象
    2)BeanListHandler: 查询返回list集合,集合元素是指定的对象
    3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
    4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
    5) ScalarHandler (通常单行单列的时候用)
    6) MapHandler 查询返回结果的第一条记录封装为map

  • query方法接收的是ResultSetHandler接口类型的对象,这使得我们可以传入不同的该接口的实现类对象,这样就可以根据我们的需求传入参数,也就是说这个接口是我们与query方法之间的协议,约定,当我们传入的对象实现了

  • ResultSetHandler接口时,QueryRunner就能帮我们将结果集中的数据封装起来,返回给我们,而且因为这里是接口的引用作为参数,那么我们也可以自定义一个类T实现ResultSetHandler接口,将T的对象传入进去,如何操作ResultSet中的数据,我们可以写在T类复写的handle方法中,这也就是ResultSetHandler接口提供给我们的可扩展性.

来源:itnose

上一篇: java(jdbc)

下一篇: tomcat的jdbc连接池PoolExhaustedException

分享到: 更多