Skip to content

JDBC

面试题 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 一个最大的好处是它可以是离线的,这样使得它更轻量级,同时便于在网络间进行传输。

更新: 2020-09-25 15:39:00
原文: <https://www.yuque.com/fcant/notes/lzxlg3&gt;

最近更新