JDBC问答题

xiaoxiao2021-02-28  85

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接口提供给我们的可扩展性.
转载请注明原文地址: https://www.6miu.com/read-94890.html

最新回复(0)