推荐!JDBC面试问题和答案汇总

下面列出了最常见的JDBC面试问题和解答。
1)什么是JDBC?
JDBC是一种Java API, 用于连接数据库并执行查询。 JDBC API使用JDBC驱动程序连接到数据库。 JDBC API可用于访问存储在任何关系数据库中的表格数据。
推荐!JDBC面试问题和答案汇总 更多细节。
2)什么是JDBC驱动程序?
JDBC驱动程序是一个软件组件, 使Java应用程序可以与数据库进行交互。 JDBC驱动程序有4种类型:

  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类。
Class.forName("oracle.jdbc.driver.OracleDriver");

建立连接:
DriverManager类的getConnection()方法用于建立与数据库的连接。下面给出了getConnection()方法的语法。
1) public static Connection getConnection(String url)throws SQLException 2) public static Connection getConnection(String url, String name, String password) throws SQLException

考虑以下示例, 以建立与Oracle数据库的连接。
Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "password");

创建语句:
Connection接口的createStatement()方法用于创建Statement。语句的对象负责对数据库执行查询。
public Statement createStatement()throws SQLException

考虑以下示例创建语句对象
Statement stmt=con.createStatement();

执行查询:
Statement接口的executeQuery()方法用于执行对数据库的查询。此方法返回ResultSet的对象, 该对象可用于获取表的所有记录。
下面给出executeQuery()方法的语法。
public ResultSet executeQuery(String sql)throws SQLException

执行查询的例子
ResultSet rs=stmt.executeQuery("select * from emp"); while(rs.next()){ System.out.println(rs.getInt(1)+" "+rs.getString(2)); }

但是, 要在数据库中执行插入和更新操作, 将使用executeUpdate()方法, 该方法返回布尔值以指示该操作已成功完成。
关闭连接:
通过关闭连接, 对象语句和ResultSet将自动关闭。 Connection接口的close()方法用于关闭连接。
close()方法的语法如下。
public void close()throws SQLException

考虑下面的示例以关闭连接。
con.close();

更多细节。
4)JDBC API组件是什么?
java.sql软件包包含JDBC API的以下接口和类。
接口:
【推荐!JDBC面试问题和答案汇总】连接:Connection对象是使用DriverManager类的getConnection()方法创建的。 DriverManager是用于连接的工厂。
Statement:Statement对象是使用Connection类的createStatement()方法创建的。 Connection接口是Statement的工厂。
PreparedStatement:使用Connection类的prepareStatement()方法创建PrepareStatement对象。它用于执行参数化查询。
ResultSet:ResultSet的对象维护一个光标, 该光标指向表的一行。最初, 光标指向第一行之前。 Statement接口的executeQuery()方法返回ResultSet对象。
ResultSetMetaData:ResultSetMetaData接口的对象包含有关数据(表)的信息, 例如列数, 列名, 列类型等。ResultSet的getMetaData()方法返回ResultSetMetaData的对象。
DatabaseMetaData:DatabaseMetaData接口提供了获取数据库元数据的方法, 例如数据库产品名称, 数据库产品版本, 驱动程序名称, 表总数的名称, 视图总数的名称等。getMetaData()方法Connection接口的返回对象为DatabaseMetaData。
CallableStatement:CallableStatement接口用于调用存储过程和函数。通过使用存储过程和函数, 我们可以在数据库上拥有业务逻辑, 这将使性能更好, 因为这些是预编译的。 Connection接口的prepareCall()方法返回CallableStatement的实例。
类:
DriverManager:DriverManager类用作用户和驱动程序之间的接口。它跟踪可用的驱动程序, 并处理在数据库和适当的驱动程序之间建立连接。它包含几种方法来保持用户和驱动程序之间的交互。
Blob:Blob代表二进制大对象。它表示存储为数据库管理系统中单个实体的二进制数据的集合。
Clob:Clob代表角色大对象。它是一种数据类型, 各种数据库管理系统都使用它来存储字符文件。它与Blob相似, 区别在于BLOB代表二进制数据, 例如图像, 音频和视频文件等, 而Clob代表字符流数据, 例如字符文件等。
SQLException这是一个Exception类, 提供有关数据库访问错误的信息。
5)什么是JDBC语句?
在JDBC中, 语句用于将SQL命令发送到数据库并从数据库接收数据。 JDBC语句提供了多种方法, 例如execute(), executeUpdate(), executeQuery等, 可帮助你与数据库进行交互。
下表提供了三种类型的JDBC语句。
Statements Explanation
声明是结果集的工厂。它用于对数据库的常规访问。它在运行时执行静态SQL查询。
当我们需要在运行时为查询提供输入参数时, 将使用PreparedStatement。
当我们需要访问数据库存储过程时, 将使用CallableStatement。它还可以接受运行时参数。
6)Class.forName()方法的返回类型是什么?
Class.forName()方法返回java.lang.Class对象的对象。
7)Statement和PreparedStatement接口之间有什么区别?
Statement PreparedStatement
PreparedStatement接口是Statement的子接口。它用于执行参数化查询。
对于PreparedStatement, 查询仅编译一次。
当我们需要在运行时为查询提供输入参数时, 将使用PreparedStatement。
更多细节。
8)如何在JDBC PreparedStatement中设置空值?
通过使用PreparedStatement接口的setNull()方法, 我们可以将null值设置为索引。该方法的语法如下。
void setNull(int parameterIndex, int sqlType) throws SQLException

9)PreparedStatement相对于Statement有什么好处?
下面提供了使用PreparedStatement而非Statement接口的好处。
  • 与Statement相比, PreparedStatement的执行速度更快, 因为每次运行代码时都需要编译Statement, 而PreparedStatement只需编译一次, 然后仅在运行时执行。
  • PreparedStatement可以执行参数化查询, 而Statement只能运行静态查询。
  • 在PreparedStatement中使用的查询似乎每次都相似。因此, 数据库可以重用以前的访问计划, 而Statement将参数内联到String中, 因此, 每次查询看起来都不相同, 这会阻止缓存重用。
10)execute, executeQuery和executeUpdate有什么区别?
execute executeQuery executeUpdate
executeQuery方法只能与select语句一起使用。 executeUpdate方法可用于更新/删除/插入数据库中的操作。
executeQuery()方法返回一个ResultSet对象, 该对象包含由select语句检索的数据。 executeUpdate()方法返回一个整数值, 该整数值表示受影响的记录数, 其中0表示查询不返回任何内容。
11)ResultSet有哪些不同类型?
ResultSet按读数头的方向以及它提供的结果的敏感度或不敏感度进行分类。 ResultSet有三种常规类型。
Description
光标只能向前移动。
光标可以沿两个方向(向前和向后)移动。 ResultSet对其他人对数据库所做的更改不敏感。
光标可以在两个方向上移动。 ResultSet对其他人对数据库所做的更改很敏感。
12)ResultSet和RowSet有什么区别?
RowSet
RowSet与数据库断开连接, 可以序列化。
ResultSet对象是一个JavaBean对象。
Rowset接口扩展了ResultSet接口, 并通过调用RowSetProvider.newFactory()。createJdbcRowSet()方法返回。
默认情况下, RowSet对象是可滚动和可更新的。
13)我们如何使用CallableStatement执行存储过程?
以下是创建和执行存储过程的步骤。在这里, 我们通过使用存储过程并向其中插入值来创建表user420。
在数据库中创建过程。
要调用存储过程, 你需要在数据库中创建它。在这里, 我们假设存储过程看起来像这样。
create or replace procedure "INSERTR" (id IN NUMBER, name IN VARCHAR2) is begin insert into user420 values(id, name); end; /

表结构如下:
create table user420(id number(10), name varchar2(200));

建立网络连接。
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle");

创建CallableStatement的对象。
CallableStatement stmt=con.prepareCall("{call insertR(?, ?)}");

提供值并使用以下语法执行查询。
stmt.setInt(1, 1011); stmt.setString(2, "Amit"); stmt.execute();

检查数据库;值将在此处找到。但是, 完整的代码如下所示。
import java.sql.*; public class Proc { public static void main(String[] args) throws Exception{Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); CallableStatement stmt=con.prepareCall("{call insertR(?, ?)}"); stmt.setInt(1, 1011); stmt.setString(2, "Amit"); stmt.execute(); System.out.println("success"); } }

14)JDBC DriverManager类的作用是什么?
DriverManager类充当用户和驱动程序之间的接口。它跟踪可用的驱动程序, 并处理在数据库和适当的驱动程序之间建立连接。 DriverManager类维护通过调用方法DriverManager.registerDriver()自行注册的Driver类的列表。
更多细节。
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接口返回数据库信息, 例如用户名, 驱动程序名称, 驱动程序版本, 表数, 视图数等。请考虑以下示例。
import java.sql.*; class Dbmd{ public static void main(String args[]){ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); DatabaseMetaData dbmd=con.getMetaData(); System.out.println("Driver Name: "+dbmd.getDriverName()); System.out.println("Driver Version: "+dbmd.getDriverVersion()); System.out.println("UserName: "+dbmd.getUserName()); System.out.println("Database Product Name: "+dbmd.getDatabaseProductName()); System.out.println("Database Product Version: "+dbmd.getDatabaseProductVersion()); con.close(); }catch(Exception e){ System.out.println(e); } } }

输出
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接口执行批处理。
import java.sql.*; class FetchRecords{ public static void main(String args[])throws Exception{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); con.setAutoCommit(false); Statement stmt=con.createStatement(); stmt.addBatch("insert into user420 values(190, 'abhi', 40000)"); stmt.addBatch("insert into user420 values(191, 'umesh', 50000)"); stmt.executeBatch(); //executing the batchcon.commit(); con.close(); }}

更多细节。
21)JDBC中的CLOB和BLOB数据类型是什么?
BLOB:Blob可以定义为可变长度的二进制大对象, 用于保存二进制数据组, 例如语音, 图像和混合媒体。它在MySQL数据库上最多可容纳2GB数据, 在Oracle数据库上最多可容纳128GB。许多数据库(例如MySQL, Oracle和DB2)都支持BLOB来存储二进制数据(图像, 视频, 音频和混合媒体)。
CLOB:Clob可以定义为可变长度的大字符对象, 用于保存基于字符的数据, 例如许多数据库中的文件。它在MySQL数据库上最多可以容纳2 GB, 在Oracle数据库上最多可以容纳128 GB。 CLOB被视为字符串。
22)JDBC中有哪些不同类型的锁定?
锁是一种软件机制, 通过它可以限制其他用户使用数据资源。 JDBC中提供了四种类型的锁, 如下所述。
  • 行锁和键锁:更新行时会使用这些类型的锁。
  • 页面锁:这些类型的锁应用于页面。在事务保留在流程中并且正在更新, 删除或在表的一行中插入一些数据的情况下使用它们。数据库服务器将锁定包含该行的整个页面。页面锁只能由数据库服务器应用一次。
  • 表锁:表锁应用于表。可以以两种方式应用它, 即共享和独占。共享锁使其他事务可以读取表但不能更新表。但是, 排他锁可防止其他人读取和写入表。
  • 数据库锁:数据库锁用于在打开数据库时防止从其他事务读取和更新访问。
23)我们如何从数据库中存储和检索图像?
通过使用PreparedStatement接口, 我们可以存储和检索图像。创建一个包含两列的表, 即NAME和PHOTO。
CREATE TABLE"IMGTABLE" ( "NAME" VARCHAR2(4000), "PHOTO" BLOB )

考虑以下示例, 将图像存储在数据库中。
import java.sql.*; import java.io.*; public class InsertImage { public static void main(String[] args) { try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); PreparedStatement ps=con.prepareStatement("insert into imgtable values(?, ?)"); ps.setString(1, "sonoo"); FileInputStream fin=new FileInputStream("d:\\g.jpg"); ps.setBinaryStream(2, fin, fin.available()); int i=ps.executeUpdate(); System.out.println(i+" records affected"); con.close(); }catch (Exception e) {e.printStackTrace(); } } }

考虑以下示例, 从表中检索图像。
import java.sql.*; import java.io.*; public class RetrieveImage { public static void main(String[] args) { try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); PreparedStatement ps=con.prepareStatement("select * from imgtable"); ResultSet rs=ps.executeQuery(); if(rs.next()){//now on 1st rowBlob b=rs.getBlob(2); //2 means 2nd column data byte barr[]=b.getBytes(1, (int)b.length()); //1 means first imageFileOutputStream fout=new FileOutputStream("d:\\sonoo.jpg"); fout.write(barr); fout.close(); }//end of if System.out.println("ok"); con.close(); }catch (Exception e) {e.printStackTrace(); } } }

更多细节。
24)我们如何将文件存储在Oracle数据库中?
PreparedStatement接口的setCharacterStream()方法用于将字符信息设置到parameterIndex中。为了将文件存储到数据库中, 表中使用了CLOB(字符大对象)数据类型。例如:
CREATE TABLE"FILETABLE" ( "ID" NUMBER, "NAME" CLOB )

Java代码
import java.io.*; import java.sql.*; public class StoreFile { public static void main(String[] args) { try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); PreparedStatement ps=con.prepareStatement( "insert into filetable values(?, ?)"); File f=new File("d:\\myfile.txt"); FileReader fr=new FileReader(f); ps.setInt(1, 101); ps.setCharacterStream(2, fr, (int)f.length()); int i=ps.executeUpdate(); System.out.println(i+" records affected"); con.close(); }catch (Exception e) {e.printStackTrace(); } } }

25)我们如何在Oracle数据库中检索文件?
PreparedStatement的getClob()方法用于从数据库中获取文件信息。让我们看一下用于检索文件的示例的表结构。
CREATE TABLE"FILETABLE" ( "ID" NUMBER, "NAME" CLOB )

下面给出了从Oracle数据库检索文件的示例。
import java.io.*; import java.sql.*; public class RetrieveFile { public static void main(String[] args) { try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); PreparedStatement ps=con.prepareStatement("select * from filetable"); ResultSet rs=ps.executeQuery(); rs.next(); //now on 1st rowClob c=rs.getClob(2); Reader r=c.getCharacterStream(); FileWriter fw=new FileWriter("d:\\retrivefile.txt"); int i; while((i=r.read())!=-1) fw.write((char)i); fw.close(); con.close(); System.out.println("success"); }catch (Exception e) {e.printStackTrace(); } } }

26)存储过程和函数之间有什么区别?
存储过程和函数之间的区别如下:
储存程序 Function
用于执行计算。
必须具有返回类型。
可能只返回一个值。
该功能仅支持输入参数。
使用try / catch的异常处理不能在用户定义的函数中使用。
27)如何使用JDBC维护数据库的完整性?
为了维护数据库的完整性, 我们需要确保ACID属性。 ACID属性表示原子性, 一致性, 隔离性和耐用性。在JDBC中, Connection接口提供了诸如setAutoCommit(), commit()和rollback()之类的方法, 可用于管理事务。让我们看一下JDBC中的事务管理示例。
import java.sql.*; class FetchRecords{ public static void main(String args[])throws Exception{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "oracle"); con.setAutoCommit(false); Statement stmt=con.createStatement(); stmt.executeUpdate("insert into user420 values(190, 'abhi', 40000)"); stmt.executeUpdate("insert into user420 values(191, 'umesh', 50000)"); con.commit(); con.close(); }}

28)什么是JDBC行集?
JDBC Rowset是ResultSet的包装。它包含诸如ResultSet之类的表格数据, 但是使用起来既简单又灵活。 RowSet接口的实现类如下:
  • JdbcRowSet
  • CachedRowSet
  • Web行集
  • 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中使用限制原因。
1 2 3 4 5 6 7 8
Java OOP面试问题
Java字符串和异常面试问题
JDBC面试问题
JSP面试问题
休眠面试问题
SQL面试题
Android面试题
MySQL面试问题
声明
准备声明
CallableStatement
Statement接口提供了对数据库执行查询的方法。语句接口是ResultSet的工厂;即, 它提供了用于获取ResultSet对象的工厂方法。
对于Statement, 每次运行程序时都会编译查询。
该语句主要用于需要在运行时运行静态查询的情况。
execute方法可用于任何SQL语句(同时选择和更新)。
execute方法返回一个布尔类型值, 其中true表示返回的ResultSet, 以后可以将其提取, 而false表示返回的是整数或void值。
类型
ResultSet.TYPE_Forward_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
结果集
ResultSet无法序列化, 因为它可以维护与数据库的连接。
ResultSet对象不是JavaBean对象
ResultSet由Statement接口的executeQuery()方法返回。
默认情况下, ResultSet对象是不可滚动且不可更新的。
用于执行业务逻辑。
不能有返回类型。
可能返回0或多个值。
该过程支持输入和输出参数。
使用try / catch块的异常处理可以在存储过程中使用。
Java基础面试问题
Java多线程面试问题
Java Collection面试题
Servlet面试问题
春季面试问题
PL / SQL面试问题
Oracle面试问题
SQL Server面试问题

    推荐阅读