JDBC 面试问题

2025年3月16日 | 阅读14分钟

以下是经常被问到的 JDBC 面试题及答案列表。


1) 什么是 JDBC?

JDBC 是一个 Java API,用于连接和执行数据库查询。JDBC API 使用 JDBC 驱动程序连接到数据库。JDBC API 可用于访问存储在任何关系数据库中的表格数据。

JDBC (Java 数据库连接) 更多详情。

2) 什么是 JDBC 驱动程序?

JDBC 驱动程序是一个使 Java 应用程序能够与数据库交互的软件组件。有 4 种类型的 JDBC 驱动程序:

  1. JDBC-ODBC 桥接驱动程序: JDBC-ODBC 桥接驱动程序使用 ODBC 驱动程序连接到数据库。JDBC-ODBC 桥接驱动程序将 JDBC 方法调用转换为 ODBC 函数调用。由于薄驱动程序的出现,这现在已不被推荐。它易于使用,并且可以轻松连接到任何数据库。
  2. 原生 API 驱动程序(部分 Java 驱动程序): 原生 API 驱动程序使用数据库的客户端库。驱动程序将 JDBC 方法调用转换为数据库 API 的原生调用。它不是完全用 Java 编写的。其性能优于 JDBC-ODBC 桥接驱动程序。但是,原生驱动程序必须安装在每个客户端机器上。
  3. 网络协议驱动程序(完全 Java 驱动程序): 网络协议驱动程序使用中间件(应用程序服务器),该中间件将 JDBC 调用直接或间接转换为特定于供应商的数据库协议。它完全用 Java 编写。由于应用程序服务器可以执行许多任务,如审计、负载均衡、日志记录等,因此不需要客户端库。
  4. 薄驱动程序(完全 Java 驱动程序): 薄驱动程序将 JDBC 调用直接转换为特定于供应商的数据库协议。这就是为什么它被称为薄驱动程序。它完全用 Java 语言编写。其性能优于所有其他驱动程序,但这些驱动程序依赖于数据库。
更多详情。

3) 在 Java 中连接数据库的步骤是什么?

数据库连接使用以下步骤:

Class 类的 forName() 方法用于注册驱动程序类。此方法用于动态加载驱动程序类。请考虑以下注册 OracleDriver 类的示例。

DriverManager 类的 getConnection() 方法用于建立与数据库的连接。getConnection() 方法的语法如下。

请考虑以下建立与 Oracle 数据库连接的示例。

Connection 接口的 createStatement() 方法用于创建 Statement。Statement 对象负责向数据库执行查询。

请考虑以下创建 Statement 对象的示例。

 

Statement 接口的 executeQuery() 方法用于执行数据库查询。此方法返回 ResultSet 对象,该对象可用于获取表的所有记录。

executeQuery() 方法的语法如下。

 

执行查询的示例。

 

然而,要对数据库执行插入和更新操作,可以使用 executeUpdate() 方法,该方法返回一个布尔值以指示操作是否成功完成。

通过关闭连接,Statement 和 ResultSet 对象将自动关闭。Connection 接口的 close() 方法用于关闭连接。

close() 方法的语法如下。

 

请考虑以下关闭连接的示例。

  • 注册驱动程序类

  • 创建连接

  • 创建 Statement

  • 执行查询
  • 关闭连接
更多详情。

4) JDBC API 的组件有哪些?

java.sql 包包含 JDBC API 的以下接口和类:

接口

  • Connection: Connection 对象通过 DriverManager 类的 getConnection() 方法创建。DriverManager 是 Connection 的工厂。

  • Statement: Statement 对象通过 Connection 类的 createStatement() 方法创建。Connection 接口是 Statement 的工厂。

  • PreparedStatement: PreparedStatement 对象通过 Connection 类的 prepareStatement() 方法创建。它用于执行参数化查询。

  • ResultSet: ResultSet 对象维护一个指向表行的游标。最初,游标指向第一行之前。Statement 接口的 executeQuery() 方法返回 ResultSet 对象。

  • ResultSetMetaData: ResultSetMetaData 接口对象包含有关数据(表)的信息,例如列数、列名、列类型等。ResultSet 的 getMetaData() 方法返回 ResultSetMetaData 对象。

  • DatabaseMetaData: DatabaseMetaData 接口提供获取数据库元信息的方法,例如数据库产品名称、数据库产品版本、驱动程序名称、表总数、视图总数等。Connection 接口的 getMetaData() 方法返回 DatabaseMetaData 对象。

  • CallableStatement: CallableStatement 接口用于调用存储过程和函数。我们可以通过使用存储过程和函数在数据库上实现业务逻辑,这将提高性能,因为它们是预编译的。Connection 接口的 prepareCall() 方法返回 CallableStatement 的实例。



  •  
  •  

  • DriverManager: DriverManager 类充当用户和驱动程序之间的接口。它跟踪可用的驱动程序,并负责在数据库和适当的驱动程序之间建立连接。它包含多个方法来保持用户和驱动程序之间的交互。

  • Blob: Blob 代表二进制大对象。它表示在数据库管理系统中存储为单个实体的二进制数据集合。

  • Clob: Clob 代表字符大对象。它是一种数据类型,被各种数据库管理系统用于存储字符文件。它与 Blob 类似,只是 Blob 代表图像、音频和视频文件等二进制数据,而 Clob 代表字符文件等字符流数据。

  • SQLException: 这是一个 Exception 类,提供有关数据库访问错误的信息。

5) JDBC 语句有哪些?

在 JDBC 中,Statement 用于将 SQL 命令发送到数据库并从数据库接收数据。JDBC Statement 提供了 execute()、executeUpdate()、executeQuery() 等各种方法,这些方法可以帮助您与数据库进行交互。

下表列出了三种类型的 JDBC Statement:

报表说明
语句Statement 是 ResultSet 的工厂。它用于一般数据库访问。它在运行时执行静态 SQL 查询。
预处理语句当我们需要在运行时为查询提供输入参数时,使用 PreparedStatement。
可调用语句当我们需要访问数据库存储过程时,使用 CallableStatement。它也可以接受运行时参数。

6) Class.forName() 方法的返回类型是什么?

Class.forName() 方法返回 java.lang.Class 对象。

7) Statement 和 PreparedStatement 接口之间有什么区别?

语句预处理语句
Statement 接口提供与数据库执行查询的方法。Statement 接口是 ResultSet 的工厂;也就是说,它提供获取 ResultSet 对象的工厂方法。PreparedStatement 接口是 Statement 的子接口。它用于执行参数化查询。
对于 Statement,每次运行程序时都会编译查询。对于 PreparedStatement,查询只编译一次。
Statement 主要用于需要在运行时运行静态查询的情况。PreparedStatement 用于需要在运行时为查询提供输入参数的情况。
更多详情。

8) 如何在 JDBC PreparedStatement 中设置 null 值?

通过使用 PreparedStatement 接口的 setNull() 方法,我们可以将 null 值设置为索引。方法的语法如下。


9) PreparedStatement 相对于 Statement 有哪些优点?

使用 PreparedStatement 相对于 Statement 接口的优点如下:

  • PreparedStatement 的性能比 Statement 快,因为 Statement 需要在每次运行代码时进行编译,而 PreparedStatement 只编译一次然后在运行时执行。
  • PreparedStatement 可以执行参数化查询,而 Statement 只能运行静态查询。
  • PreparedStatement 中使用的查询看起来每次都一样。因此,数据库可以重用以前的访问计划,而 Statement 将参数内联到字符串中,因此查询每次看起来都不一样,这阻止了缓存重用。

10) execute、executeQuery 和 executeUpdate 之间有什么区别?

executeexecuteQueryexecuteUpdate
execute 方法可用于任何 SQL 语句(Select 和 Update 都适用)。executeQuery 方法只能与 select 语句一起使用。executeUpdate 方法可用于数据库中的更新/删除/插入操作。
execute 方法返回一个布尔类型的值,其中 true 表示返回了 ResultSet,可以稍后提取;false 表示返回了一个整数或 void 值。executeQuery() 方法返回一个 ResultSet 对象,其中包含 select 语句检索到的数据。executeUpdate() 方法返回一个整数值,表示受影响的记录数,其中 0 表示查询未返回任何内容。

11) ResultSet 有哪几种类型?

ResultSet 根据读取头的方向以及它提供的结果的敏感性或不敏感性进行分类。有三种常规类型的 ResultSet:

类型描述
ResultSet.TYPE_Forward_ONLY游标只能向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE游标可以双向移动(向前和向后)。ResultSet 对其他人对数据库所做的更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE游标可以双向移动。ResultSet 对其他人对数据库所做的更改敏感。

12) ResultSet 和 RowSet 之间有什么区别?

结果集RowSet
ResultSet 由于维护与数据库的连接而无法序列化。RowSet 与数据库断开连接,可以序列化。
ResultSet 对象不是 JavaBean 对象。ResultSet 对象是 JavaBean 对象。
ResultSet 由 Statement 接口的 executeQuery() 方法返回。Rowset 接口扩展了 ResultSet 接口,并通过调用 RowSetProvider.newFactory().createJdbcRowSet() 方法返回。
ResultSet 对象默认是不可滚动且不可更新的。RowSet 对象默认是可滚动和可更新的。

13) 如何使用 CallableStatement 执行存储过程?

以下是创建和执行存储过程的步骤。在此,我们将使用存储过程创建一个名为 user420 的表,并向其中插入值。

要调用存储过程,您需要在数据库中创建它。在此,我们假设存储过程如下所示。

表结构如下:

  • 在数据库中创建过程。

  • 建立网络连接。

  • 创建 CallableStatement 对象。

  • 使用以下语法提供值并执行查询。

  • 检查数据库;将在此处找到值。但是,完整的代码将如下所示。

14) JDBC DriverManager 类的作用是什么?

DriverManager 类充当用户和驱动程序之间的接口。它跟踪可用的驱动程序,并负责在数据库和适当的驱动程序之间建立连接。DriverManager 类维护一个 Driver 类列表,这些类通过调用 DriverManager.registerDriver() 方法进行注册。

更多详情。

15) JDBC Connection 接口的功能是什么?

Connection 接口维护与数据库的会话。它可以用于事务管理。它提供创建 Statement、PreparedStatement、CallableStatement 和 DatabaseMetaData 实例的工厂方法。

更多详情。

16) JDBC ResultSet 接口是做什么的?

ResultSet 对象表示表的一行。它可以用于更改游标指针并从数据库获取信息。默认情况下,ResultSet 对象只能向前移动,并且是不可更新的。但是,我们可以通过在 createStatement(int, int) 方法中传递 TYPE_SCROLL_INSENSITIVE 或 TYPE_SCROLL_SENSITIVE 来使该对象向前和向后移动。

更多详情。

17) JDBC ResultSetMetaData 接口是做什么的?

ResultSetMetaData 接口返回表的信息,例如列总数、列名、列类型等。

更多详情。

18) JDBC DatabaseMetaData 接口是做什么的?

DatabaseMetaData 接口返回数据库的信息,例如用户名、驱动程序名称、驱动程序版本、表数、视图数等。请看以下示例。

输出

Driver Name: Oracle JDBC Driver
Driver Version: 10.2.0.1.0XE
Database Product Name: Oracle
Database Product Version: Oracle Database 10g Express Edition Release 10.2.0.1.0 -Production
更多详情。

19) 哪个接口负责 JDBC 中的事务管理?

Connection 接口提供事务管理的方法,如 commit()、rollback() 等。

更多详情。

20) 什么是批量处理?如何在 JDBC 中执行批量处理?

通过使用 JDBC 中的批量处理技术,我们可以执行多个查询。这可以提高性能。java.sql.Statement 和 java.sql.PreparedStatement 接口提供了批量处理的方法。JDBC 中的批量处理需要以下步骤:

  • 加载驱动程序类
  • 创建连接
  • 创建 Statement
  • 将查询添加到批处理中
  • 执行批处理
  • 关闭连接

请考虑以下使用 Statement 接口执行批量处理的示例。

更多详情。

21) JDBC 中的 CLOB 和 BLOB 数据类型是什么?

BLOB: Blob 可以定义为变长二进制大对象,用于保存二进制数据组,如语音、图像和混合媒体。它在 MySQL 数据库中最多可以保存 2GB 数据,在 Oracle 数据库中最多可以保存 128 GB 数据。BLOB 被许多数据库支持,如 MySQL、Oracle 和 DB2,用于存储二进制数据(图像、视频、音频和混合媒体)。

CLOB: Clob 可以定义为变长字符大对象,用于在许多数据库中保存基于字符的数据。它在 MySQL 数据库中最多可以保存 2GB 数据,在 Oracle 数据库中最多可以保存 128 GB 数据。CLOB 被认为是字符串。


22) JDBC 中有哪些不同类型的锁定?

锁定是一种特定类型的软件机制,通过这种机制,我们可以限制其他用户使用数据资源。JDBC 中有四种锁,如下所述。

  • 行和键锁定: 在更新行时使用这些类型的锁定。
  • 页锁定: 这些类型的锁定应用于页面。它们用于一个事务正在进行中,并且正在更新、删除或插入表中的某一行。数据库服务器会锁定包含该行的整个页面。页面锁定可以由数据库服务器应用一次。
  • 表锁定: 表锁定应用于表。它可以以两种方式应用,即共享和独占。共享锁定允许其他事务读取表但不更新它。但是,独占锁定会阻止其他人读取和写入表。
  • 数据库锁定: 数据库锁定用于在数据库打开时阻止其他事务的读写访问。

23) 如何从数据库存储和检索图像?

通过使用 PreparedStatement 接口,我们可以存储和检索图像。创建一个包含 NAME 和 PHOTO 两个列的表。

请考虑以下将图像存储到数据库的示例。

请考虑以下从表中检索图像的示例。

更多详情。

24) 如何在 Oracle 数据库中存储文件?

PreparedStatement 接口的 setCharacterStream() 方法用于将字符信息设置到 parameterIndex。要将文件存储到数据库,表中使用了 CLOB(字符大对象)数据类型。例如:

Java 代码


25) 如何在 Oracle 数据库中检索文件?

PreparedStatement 的 getClob() 方法用于从数据库中获取文件信息。让我们看看检索文件的示例的表结构。

以下是在 Oracle 数据库中检索文件的示例。


26) 存储过程和函数之间有什么区别?

存储过程和函数之间的区别如下:

Stored Procedure函数
用于执行业务逻辑。用于执行计算。
不得有返回类型。必须有返回类型。
可以返回零个或多个值。只能返回一个值。
过程支持输入和输出参数。函数仅支持输入参数。
可以在存储过程中使用 try/catch 块进行异常处理。在用户定义函数中不能使用 try/catch 进行异常处理。

27) 如何使用 JDBC 维护数据库的完整性?

为了维护数据库的完整性,我们需要确保 ACID 属性。ACID 属性意味着原子性、一致性、隔离性和持久性。在 JDBC 中,Connection 接口提供了 setAutoCommit()、commit() 和 rollback() 等方法,可用于管理事务。让我们来看一个 JDBC 中事务管理的例子。


28) 什么是 JDBC Rowset?

JDBC Rowset 是 ResultSet 的包装器。它像 ResultSet 一样保存表格数据,但使用起来更简单灵活。RowSet 接口的实现类如下:

  • JdbcRowSet
  • CachedRowSet
  • WebRowSet
  • JoinRowSet
  • FilteredRowSet

29) java.util.Date 和 java.sql.Date 数据类型之间有什么主要区别?

java.util.Date 和 java.sql.Date 之间的主要区别在于,java.sql.Date 表示不带时间信息的日期,而 java.util.Date 表示日期和时间信息。


30) JDBC setMaxRows 方法做什么?

setMaxRows(int i) 方法限制数据库通过查询返回的行数。这也可以在查询中完成,因为我们在 MySQL 中可以使用 limit 子句。

1 2 3 4 5 6 7 8