JDBC 面试题



尊敬的读者,这些JDBC 面试题专为帮助您了解在JDBC主题面试中可能遇到的问题类型而设计。根据我的经验,优秀的 interviewers 很少会在面试前计划好要问哪些特定问题,通常问题会从该主题的一些基本概念开始,然后根据进一步的讨论和您的回答继续进行。

JDBC 代表 Java 数据库连接 (Java Database Connectivity),它是一个标准的 Java API,用于在 Java 编程语言和各种数据库之间建立独立于数据库的连接。

通用的 JDBC 架构由两层组成:JDBC API(提供应用程序到 JDBC 管理器的连接)和 JDBC 驱动程序 API(支持 JDBC 管理器到驱动程序的连接)。

JDBC API 包含以下接口和类:DriverManager、Driver、Connection、Statement、ResultSet、SQLException。

JDBC DriverManager 是一个管理数据库驱动程序列表的类。它使用通信子协议将来自 Java 应用程序的连接请求与正确的数据库驱动程序匹配。

JDBC 驱动程序是一个接口,使 Java 应用程序能够与数据库交互。为了连接到各个数据库,JDBC 需要每个数据库的驱动程序。JDBC 驱动程序发出到数据库的连接,并实现客户端和数据库之间查询和结果传输的协议。

Connection 接口包含用于联系数据库的方法。连接对象表示通信上下文。

Statement 封装了要传递给数据库的 SQL 语句,以便进行解析、编译、规划和执行。

这些对象保存从数据库检索到的数据,这些数据是在使用 Statement 对象执行 SQL 查询后获得的。它充当迭代器,允许您遍历其数据。java.sql.ResultSet 接口表示数据库查询的结果集。

有三个常量,当在结果集中定义时,可以使游标在结果集中向后、向前以及特定行移动。

  • ResultSet.TYPE_FORWARD_ONLY − 游标只能在结果集中向前移动。

  • ResultSet.TYPE_SCROLL_INSENSITIVE − 游标可以向前和向后滚动,并且结果集对结果集创建后其他人对数据库所做的更改不敏感。

  • ResultSet.TYPE_SCROLL_SENSITIVE − 游标可以向前和向后滚动,并且结果集对结果集创建后其他人对数据库所做的更改敏感。

以下是创建 JDBC 应用程序的基本步骤:

  • 导入包含数据库编程所需的 JDBC 类的包。

  • 注册 JDBC 驱动程序,以便您可以打开与数据库的通信通道。

  • 使用 DriverManager.getConnection() 方法打开连接。

  • 使用 Statement 类型的对象执行查询。

  • 使用适当的 ResultSet.getXXX() 方法从结果集中提取数据。

  • 通过关闭所有数据库资源来清理环境,依赖于 JVM 的垃圾收集。

JDBC 驱动程序有四种类型:

  • JDBC-ODBC 桥加 ODBC 驱动程序 − 也称为类型 1,调用本地可用的 ODBC 驱动程序的原生代码。

  • 本地 API,部分 Java 驱动程序 − 也称为类型 2,调用客户端上的数据库厂商本地库。然后,此代码通过网络与数据库通信。

  • JDBC-Net,纯 Java 驱动程序 − 也称为类型 3,纯 Java 驱动程序,它与服务器端中间件通信,然后中间件与数据库通信。

  • 原生协议,纯 Java 驱动程序 − 也称为类型 4,纯 Java 驱动程序,它使用数据库原生协议。

以下是四种驱动程序类型的使用时机列表:

  • 如果您访问的是一种类型的数据库,例如 Oracle、Sybase 或 IBM,则首选驱动程序类型为 4。

  • 如果您的 Java 应用程序同时访问多种类型的数据库,则类型 3 是首选驱动程序。

  • 在您的数据库尚无类型 3 或类型 4 驱动程序的情况下,类型 2 驱动程序非常有用。

  • 类型 1 驱动程序不被认为是部署级驱动程序,通常仅用于开发和测试目的。

JDBC Net 纯 Java 驱动程序(类型 4)是最快的驱动程序,因为它将 JDBC 调用转换为特定于供应商的协议调用,并直接与数据库交互。

不支持。当您使用 JDBC-ODBC 桥时,每个连接只能打开一个 Statement 对象。

标准隔离级别为:

  • TRANSACTION_NONE

  • TRANSACTION_READ_COMMITTED

  • TRANSACTION_READ_UNCOMMITTED

  • TRANSACTION_REPEATABLE_READ

  • TRANSACTION_SERIALIZABLE

JDBC 架构将抽象与其实现解耦。因此,JDBC 遵循桥接设计模式。JDBC API 提供抽象,JDBC 驱动程序提供实现。无需更改客户端代码即可将新的驱动程序插入 JDBC API。

语句类型包括:

  • Statement − 常规 SQL 语句。

  • PreparedStatement − 由于 SQL 预编译,因此比 Statement 更高效。

  • CallableStatement − 用于调用数据库上的存储过程。

PreparedStatement 提供更好的性能,因为它们是预编译的。PreparedStatement 对不同的参数重用相同的执行计划,而不是每次都创建一个新的执行计划。PreparedStatement 使用绑定参数,这些参数被发送到数据库引擎。这允许将具有相同 PreparedStatement 但不同参数的不同请求映射到执行相同的执行计划。PreparedStatement 更安全,因为它们使用绑定变量,这可以防止 SQL 注入攻击。

  • Class.forName() − 此方法动态地将驱动程序的类文件加载到内存中,这会自动注册它。此方法更可取,因为它允许您使驱动程序注册可配置和可移植。

  • DriverManager.registerDriver() − 如果您使用的是非 JDK 兼容的 JVM(例如 Microsoft 提供的 JVM),则使用此静态方法。

以下是 JDBC 4.0 的一些优点:

  • 自动加载 JDBC 驱动程序类。在早期版本中,我们必须使用 class.forName() 手动注册和加载驱动程序。

  • 连接管理增强功能。向 javax.sql.PooledConnection 添加了新方法。

  • 使用注释的 SQL 数据集实现。

  • SQL XML 支持。

JDBC 驱动程序的性能或速度取决于许多因素:驱动程序代码的质量、驱动程序代码的大小、数据库服务器及其负载、网络拓扑、请求被转换为不同 API 的次数。

谈谈您的实际经验。

DriverManager.getConnection() 有三个重载方法可用于创建连接对象:

getConnection(String url, String user, String password) 使用带有用户名和密码的数据库 URL。例如:

String URL = "jdbcoraclethin@amrood1521EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
getConnection(String url)Using only a database URL. For example
String URL = "jdbcoraclethinusername/password@amrood1521EMP";
Connection conn = DriverManager.getConnection(URL);
getConnection(String url, Properties prop)Using a database URL and a Properties object. For example
String URL = "jdbcoraclethin@amrood1521EMP";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

使用 DatabaseMetaData 方法 supportsOpenStatementsAcrossCommit() 和 supportsOpenStatementsAcrossRollback() 进行检查。

规范中没有提到 Statement.addBatch() 的任何大小限制,这取决于驱动程序。

ResultSet 接口中包含几个涉及移动游标的方法,例如 beforeFirst()、afterLast()、first()、last()、absolute(int row)、relative(int row)、previous()、next()、getRow()、moveToInsertRow()、moveToCurrentRow()。

ResultSet 接口包含每种可能数据类型的 get 方法,每个 get 方法有两个版本:

  • 一个接受列名。

  • 一个接受列索引。

例如 getInt(String columnName)、getInt(int columnIndex)

ResultSet 接口包含用于更新结果集数据的 update 方法集合。每种数据类型的每个 update 方法都有两个版本:

  • 一个接受列名。

  • 一个接受列索引。

这些方法会更改 ResultSet 对象中当前行的列,但不会更改底层数据库中的数据。要将更改更新到数据库中的行,您需要调用以下方法之一:

updateRow(),deleteRow(),refreshRow(),cancelRowUpdates(),insertRow()

JDBC 驱动程序会在将 Java 数据类型发送到数据库之前将其转换为相应的 JDBC 类型。它对大多数数据类型使用默认映射。例如,Java int 将转换为 SQL INTEGER。

“No suitable driver”错误发生在调用 DriverManager.getConnection 方法期间,可能由以下任何原因引起:

  • 在调用 getConnection 方法之前未能加载相应的 JDBC 驱动程序。

  • 指定了无效的 JDBC URL,JDBC 驱动程序无法识别该 URL。

  • 如果桥接所需的一个或多个共享库无法加载,则可能发生此错误。

SQL 对 NULL 值的使用和 Java 对 null 的使用是不同的概念。您可以使用三种策略:

  • 避免使用返回基本数据类型的 getXXX() 方法。

  • 对基本数据类型使用包装类,并使用 ResultSet 对象的 wasNull() 方法测试接收 getXXX() 方法返回值的包装类变量是否应设置为 null。

  • 使用基本数据类型和 ResultSet 对象的 wasNull() 方法测试接收 getXXX() 方法返回值的基本变量是否应设置为您选择用来表示 NULL 的可接受值。

创建连接时,它处于自动提交模式。这意味着每个单独的 SQL 语句都被视为一个事务,并在执行后立即自动提交。通过将自动提交设置为 false,在显式调用 commit 方法之前,不会提交任何 SQL 语句。

原因如下:

  • 提高性能。

  • 维护业务流程的完整性。

  • 使用分布式事务。

保存点标志当前事务可以回滚到的点。它可以选择只回滚其中的一部分更改,而不是回滚所有更改。例如,假设您:

  • 启动事务。

  • 向表中插入 10 行。

  • 设置保存点。

  • 再插入 5 行。

  • 回滚到保存点。

  • 提交事务。

执行此操作后,表将包含您插入的前 10 行。另外 5 行将被回滚删除。保存点只是当前事务可以回滚到的标记。

SQLWarning 对象是 SQLException 的一个子类,用于处理数据库访问警告。与异常不同,警告不会停止应用程序的执行。它们只是提醒用户某些事情没有按计划进行。可以在 Connection 对象、Statement 对象(包括 PreparedStatement 和 CallableStatement 对象)或 ResultSet 对象上报告警告。这些类中的每一个都有一个 getWarnings 方法。

批处理允许您将相关的 SQL 语句分组到一个批次中,并使用一次调用将其提交到数据库。

使用 Statement 或 PrepareStatement 对象进行批处理的典型步骤序列是:

  • 如果使用 PrepareStatement 对象进行批处理,请创建带有占位符的 SQL 语句。

  • 分别使用 createStatement() 或 prepareStatement() 方法创建 Statement 或 PrepareStatement 对象。

  • 使用 setAutoCommit() 将自动提交设置为 false。

  • 使用已创建的 statement 对象上的 addBatch() 方法将任意数量的 SQL 语句添加到批处理中。

  • 使用已创建的 statement 对象上的 executeBatch() 方法执行所有 SQL 语句。

  • 最后,使用 commit() 方法提交所有更改。

存储过程是一组构成逻辑单元并执行特定任务的 SQL 语句。例如,员工数据库上的操作(雇用、解雇、提升、查找)可以编码为由应用程序代码执行的存储过程。可以使用 JDBC API 中的 CallableStatement 类调用存储过程。例如,以下代码演示了这一点。

CallableStatement cs = con.prepareCall("{call MY_SAMPLE_STORED_PROC}");
ResultSet rs = cs.executeQuery();

转义语法使您可以灵活地使用使用标准 JDBC 方法和属性无法使用的数据库特定功能。

一般的 SQL 转义语法格式如下:

{keyword 'parameters'}.

JDBC 定义的转义序列包含以下语言功能的标准语法:

  • 日期、时间和时间戳文字(d、t、ts 关键字)。

  • 标量函数,例如数值、字符串和数据类型转换函数(fn 关键字)。

  • 外部连接(oj 关键字)。

  • LIKE 子句中使用的通配符的转义字符(escape 关键字)。

  • 过程调用(call 关键字)。

事务是逻辑工作单元。要完成逻辑工作单元,可能需要对数据库执行多个操作。事务用于提供数据完整性、正确的应用程序语义以及并发访问期间数据的一致视图。

按照以下步骤操作:

//turn off the implicit commit
Connection.setAutoCommit(false);
//..your insert/update/delete goes here
Connection.Commit();
//a new transaction is implicitly started.

发出连接请求时,DriverManager 会询问每个已加载的驱动程序是否理解发送的 URL。如果传递的 URL 构造不正确,则返回“No Suitable Driver”消息。

  • boolean execute() - 执行任何类型的 SQL 语句。

  • ResultSet executeQuery() - 通常用于读取数据库内容。输出将采用 ResultSet 的形式。通常使用 SELECT 语句。

  • int executeUpdate() - 通常用于更改数据库。通常在此处使用 DROP TABLE 或 DATABASE、INSERT into TABLE、UPDATE TABLE、DELETE from TABLE 语句。输出将采用 int 的形式,表示查询影响的行数。

您需要关闭结果集、语句和连接。如果连接来自池,关闭它实际上是将其送回池中以供重用。我们可以在 finally{} 块中执行此操作,这样即使抛出异常,您仍然有机会关闭它。

这些用于将大量数据(如图像、电影等)存储到数据库中,这些数据的大小非常大。

每个数据库供应商都通过驱动程序提供 ResultSet 和其他接口的实现。

连接池是一种用于重用物理连接并减少应用程序开销的技术。连接池功能最大限度地减少了创建和关闭会话中的昂贵操作。数据库供应商帮助多个客户端共享一组缓存的连接对象,这些对象提供对数据库的访问。客户端无需每次都创建一个新连接来与数据库交互。

如果您使用的是 WebLogic、WebSphere、jBoss、Tomcat 等应用程序服务器,则应用程序服务器提供配置连接池的功能。如果您不使用应用程序服务器,则可以使用 Apache Commons DBCP Component 等组件。

java.sql.Blob 的性能更好,因为它只有在您明确要求时才会从数据库中提取数据。

java.sql.Clob 的性能更好,因为它只有在您明确要求时才会从数据库中提取数据。

使用 Statement.setFetchSize 方法指示每次数据库提取的大小。

Class.forName("MyClass")

  • 加载 MyClass 类。

  • 执行 MyClass 的任何静态块代码。

  • 返回 MyClass 的实例。

不,不是。import 语句告诉编译器查找哪个类。Class.forName() 指示 Class 类查找类加载器并将该特定 Class 对象加载到 JVM 使用的内存中。

ResultSet 并发性决定了 ResultSet 是否可以更新或只能读取。ResultSet 可以具有以下两种并发级别之一:

  • ResultSet.CONCUR_READ_ONLY - 表示 ResultSet 只能读取。

  • ResultSet.CONCUR_UPDATABLE - 表示 ResultSet 既可以读取也可以更新。

setMaxRows(int) 和 setFetchSize(int) 之间的区别是:

  • setFetchSize(int) 定义了当 ResultSet 需要更多行时将从数据库读取的行数。setFetchSize(int) 影响数据库返回 ResultSet 数据的方式。

  • ResultSet 的 setMaxRows(int) 方法指定 ResultSet 每次可以包含多少行。setMaxRows(int) 影响客户端 JDBC 对象。

JDBC RowSet 对象以比结果集更灵活、更易于使用的方式保存表格数据。RowSet 对象是 JavaBeans 组件。

RowSet 有两种类型:

  • 连接的 连接的 RowSet 对象是永久性的。它不会终止,直到应用程序终止。

  • 断开的 断开的 RowSet 对象是临时性的。每当它需要从数据库检索数据时,它都会建立连接,并在完成所需任务后关闭连接。在断开状态下修改的数据会在重新建立连接后更新。

在典型的数据库事务中,假设一个事务读取并更改值,而第二个事务在第一个事务提交或回滚之前读取该值。此读取过程称为“脏读”。因为第一个事务始终有可能回滚更改,这会导致第二个事务读取无效值。

TRANSACTION_READ_COMMITTED 可防止脏读。

JDBC API 具有两个元数据接口 DatabaseMetaData 和 ResultSetMetaData。元数据提供了关于整个数据库的全面信息。这些接口的实现由数据库驱动程序供应商实现,以便让用户了解数据库的功能。

请按照以下步骤操作

首先设置新的ODBC数据源。转到“管理工具”->“数据源(ODBC)”->“系统DSN”选项卡->“添加”->“Microsoft Excel (*.xls)驱动程序”->“完成”。现在,请为数据源命名(例如SampleExcel)并添加描述。接下来,点击“选择工作簿”并指向您的Excel表格。

在代码中进行以下代码添加

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbcodbcSampleExcel","","");
stmt = conn.createStatement();
sql = "select * from [Sheet1$]";
rs=stmt.executeQuery(sql);

其中Sheet1是Excel工作表名称。

  • Hibernate是一个对象关系映射工具。它将对象映射到关系数据。

  • Java命名和目录接口(JNDI)是一个访问不同命名和目录服务的API。您可以使用它来访问存储在目录或命名服务中的内容,而无需专门为该命名或目录服务编写代码。

  • Java数据库连接(JDBC)API是一个访问不同关系数据库的API。您可以使用它来访问关系数据库,而无需在代码中嵌入对特定数据库类型的依赖。

接下来是什么?

接下来您可以回顾一下您之前完成的与该主题相关的作业,并确保您可以自信地谈论它们。如果您是应届毕业生,面试官并不期望您能回答非常复杂的问题,而是希望您掌握扎实的基础概念。

其次,即使您无法回答一些问题,也并不重要,重要的是您回答的任何问题都必须充满自信。所以在面试中要保持自信。Tutorialspoint祝您面试顺利,并祝您未来一切顺利!干杯 :-)

广告