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接口提供给我们的可扩展性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值