面试题 Java JDBC

什么是JDBC?

JDBC的全称是Java DataBase Connection,也就是Java数据库连接,可以用它来操作关系型数据库。
JDBC接口及相关类在java.sql包和javax.sql包里。
可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。

原生 JDBC操作数据库流程?

1.Class.forName()加载数据库连接驱动;
2.DriverManager.getConnection()获取数据连接对象;
3.根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;
4.执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
5.关闭结果集、关闭会话、关闭连接。

JDBC中的Statement 和PreparedStatement的区别?

  • PreparedStatement 继承于 Statement,PreparedStatement 实例包含已编译的 SQL 语句,所以其执行
    速度要快于 Statement 对象。
  • 作为Statement的子类 , PreparedStatement 继承了 Statement 的所有功能 。三 种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
  • Statement 一般用于执行固定的没有参数的SQL
  • PreparedStatement 一般用于执行有 ?参数预编译的SQL语句。
  • PreparedStatement支持?操作参数,相对于Statement更加灵活。
  • PreparedStatement可以防止SQL注入,安全性高于Statement。

在 JDBC 应用中,在任何时候都不要使用 Statement,原因如下:
①代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。
②PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不会再次需要
编译。
③最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系。

关系数据库中连接池的机制是什么?

前提:为数据库连接建立一个缓冲池。
1:从连接池获取或创建可用连接
2:使用完毕之后,把连接返回给连接池
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。

JDBC是如何实现的Java程序和JDBC驱动的松耦合的?

通过制定接口,数据库厂商来实现。只要通过接口调用即可。
驱动只有在通过的Class.forName反射机制来加载的时候才会出现。

有哪些不同的结果集?

一共有三种ResultSet对象。

  • ResultSet.TYPE_FORWARD_ONLY:这是默认的类型,它的游标只能往下移。
  • ResultSet.TYPE_SCROLL_INSENSITIVE:游标可以上下移动,一旦它创建后,数据库里的数据再发生修改,对它来说是透明的。
  • ResultSet.TYPE_SCROLL_SENSITIVE:游标可以上下移动,如果生成后数据库还发生了修改操作,它是能够感知到的。

ResultSet中有两种并发类型。

  • ResultSet.CONCUR_READ_ONLY:ResultSet是只读的,这是默认类型。
  • ResultSet.CONCUR_UPDATABLE:可以使用的ResultSet的更新方法来更新里面的数据。

    常见的JDBC异常有哪些?

  • java.sql.SQLException:JDBC异常的基类。

  • java.sql.BatchUpdateException:当批处理操作执行失败的时候可能会抛出这个异常。这取决于具体的JDBC驱动的实现,它也可能直接抛出基类异常java.sql.SQLException中。
  • java.sql.SQLWarning:SQL操作出现的警告信息。
  • java.sql.DataTruncation:字段值由于某些非正常原因被截断了

    JDBC的DataSource是什么,有什么好处?

    DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:

  • 缓存PreparedStatement以便更快的执行

  • 可以设置连接超时时间
  • 提供日志记录的功能
  • ResultSet大小的最大阈值设置
  • 通过JNDI的支持,可以为servlet容器提供连接池的功能

    execute,executeQuery,executeUpdate的区别是什么?

  • execute可以用来执行任意SQL语句,返回一个boolean的值,表明该语句是否返回了一个结果集对象ResultSet。

  • executeUpdate 用来执行修改,插入,删除操作,执行SELECT会抛出异常
  • executeQuery只能进行SELECT,从而得到结果集对象,DELETE、UPDATE、INSERT操作都会抛出异常

    通常不使用execute,如果不知道要执行的SQL语句是什么类型的,就可以使用execute。

数据库连接池的原理。为什么要使用连接池?

数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

JDBC的DriverManager是用来做什么的?

JDBC的DriverManager是一个工厂类,通过它来创建数据库连接。
当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面,然后会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

RowSet和ResultSet的区别?

RowSet继承自ResultSet,因此它有ResultSet的全部功能,同时它自己添加了些额外的特性。
RowSet一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。