Java + JDBC概念性的定义

来源:互联网 发布:linux查看当前用户和组 编辑:程序博客网 时间:2024/06/06 03:23

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

** Java DataBase Connectivity
jdbc是java提供给数据库厂商的接口,
实现了接口的数据库就可以通过jdbc api与java代码连接,通过相应的数据库驱动与数据库连接后,就可以使用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(result.next()){    String xxx = resultSet.getString("xxx列");}

在ResultSet中,封装了一个类似指针的东西,刚开始这个指针指向的是0位置,当调用next()方法时,就会将指针移动到1位置,如果1位置有值,则next()方法会返回true,无值也就返回false,返回false就跳出循环了

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

1, 防止SQL注入:如果接收用户传过来的参数,通过statement对象执行sql语句为下面的:
sql String sql = “select *from user where name=”’”+ name+ “’”;
而用户输入的name参数为下面的:sql 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 Anmail{}class Cat extends Anmail{}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

1, query方法接收的是ResultSetHanler接口类型的对象,这使得我们可以传入不同的该接口的实现类对象,这样就可以根据我们得需求传入参数,也就是说这个接口是我们与query方法之间的协议,约定,当我们传入的对象实现了2, ResultSetHanler接口时,QueryRunner就能帮我们将结果集中的数据封装起来,返回给我们,而且因为这里是接口的引用作为参数,那么我们也可以自定义一个类T实现ResultSetHanler接口,将T的对象传入进去,如何操作ResultSet中的数据,我们可以写在T类复写的handler方法中,也就是ResultSetHanler接口提供给我们得可扩展性
原创粉丝点击