- JDBC 教程
- JDBC - 首页
- JDBC - 简介
- JDBC - SQL 语法
- JDBC - 环境配置
- JDBC - 示例代码
- JDBC - 驱动程序类型
- JDBC - 连接
- JDBC - 语句
- JDBC - 结果集
- JDBC - 数据类型
- JDBC - 事务
- JDBC - 异常
- JDBC - 批处理
- JDBC - 存储过程
- JDBC - 数据流
- JDBC - RowSet
- JDBC - 复制数据库
- JDBC - ACID 属性
- JDBC - 连接池
- JDBC 示例
- JDBC - 创建数据库
- JDBC - 选择数据库
- JDBC - 删除数据库
- JDBC - 创建表
- JDBC - 删除表
- JDBC - 插入记录
- JDBC - 查询记录
- JDBC - 更新记录
- JDBC - 删除记录
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 数据排序
- JDBC 有用资源
- JDBC - 问答
- JDBC - 快速指南
- JDBC - 有用资源
- JDBC - 讨论
- 有用 - Java 教程
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祝您面试顺利,并祝您未来一切顺利!干杯 :-)