下面列出了最常见的JDBC面试问题和解答。
1)什么是JDBC?
JDBC是一种Java API, 用于连接数据库并执行查询。 JDBC API使用JDBC驱动程序连接到数据库。 JDBC API可用于访问存储在任何关系数据库中的表格数据。
更多细节。
2)什么是JDBC驱动程序?
JDBC驱动程序是一个软件组件, 使Java应用程序可以与数据库进行交互。 JDBC驱动程序有4种类型:
- JDBC-ODBC桥驱动程序:JDBC-ODBC桥驱动程序使用ODBC驱动程序连接到数据库。 JDBC-ODBC桥驱动程序将JDBC方法调用转换为ODBC函数调用。由于瘦的驱动程序, 现在不建议这样做。它易于使用, 并且可以轻松连接到任何数据库。
- 本机API驱动程序(部分为Java驱动程序):本机API驱动程序使用数据库的客户端库。驱动程序将JDBC方法调用转换为数据库API的本机调用。它不是完全用Java编写的。它的性能优于JDBC-ODBC桥驱动程序。但是, 本机驱动程序必须安装在每台客户端计算机上。
- 网络协议驱动程序(完全为Java驱动程序):网络协议驱动程序使用中间件(应用程序服务器), 该中间件将JDBC调用直接或间接转换为供应商特定的数据库协议。它完全用Java编写。客户端库没有要求, 因为应用程序服务器可以执行许多任务, 例如审核, 负载平衡, 日志记录等。
- 瘦驱动程序(完全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。它还可以接受运行时参数。 |
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中, 因此, 每次查询看起来都不相同, 这会阻止缓存重用。
execute | executeQuery | executeUpdate |
---|---|---|
executeQuery方法只能与select语句一起使用。 | executeUpdate方法可用于更新/删除/插入数据库中的操作。 | |
executeQuery()方法返回一个ResultSet对象, 该对象包含由select语句检索的数据。 | executeUpdate()方法返回一个整数值, 该整数值表示受影响的记录数, 其中0表示查询不返回任何内容。 |
ResultSet按读数头的方向以及它提供的结果的敏感度或不敏感度进行分类。 ResultSet有三种常规类型。
Description |
光标只能向前移动。 |
光标可以沿两个方向(向前和向后)移动。 ResultSet对其他人对数据库所做的更改不敏感。 |
光标可以在两个方向上移动。 ResultSet对其他人对数据库所做的更改很敏感。 |
RowSet |
RowSet与数据库断开连接, 可以序列化。 |
ResultSet对象是一个JavaBean对象。 |
Rowset接口扩展了ResultSet接口, 并通过调用RowSetProvider.newFactory()。createJdbcRowSet()方法返回。 |
默认情况下, RowSet对象是可滚动和可更新的。 |
以下是创建和执行存储过程的步骤。在这里, 我们通过使用存储过程并向其中插入值来创建表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中的批处理需要执行以下步骤。
- 加载驱动程序类
- 建立连接
- 建立陈述
- 批量添加查询
- 执行批处理
- 紧密连接
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中提供了四种类型的锁, 如下所述。
- 行锁和键锁:更新行时会使用这些类型的锁。
- 页面锁:这些类型的锁应用于页面。在事务保留在流程中并且正在更新, 删除或在表的一行中插入一些数据的情况下使用它们。数据库服务器将锁定包含该行的整个页面。页面锁只能由数据库服务器应用一次。
- 表锁:表锁应用于表。可以以两种方式应用它, 即共享和独占。共享锁使其他事务可以读取表但不能更新表。但是, 排他锁可防止其他人读取和写入表。
- 数据库锁:数据库锁用于在打开数据库时防止从其他事务读取和更新访问。
通过使用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的异常处理不能在用户定义的函数中使用。 |
为了维护数据库的完整性, 我们需要确保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
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面试问题
推荐阅读
- 史上最全JSP面试问题和答案整理
- 安卓API学习持续更新中...
- Flutter环境搭建 之 Android license status unknown
- Android Native和Hybrid两种架构采用Appium进行UI自动化
- cnpm : 无法加载文件 C:UserssoAppDataRoamingpmcnpm.ps1,因为在此系统上禁止运行脚本。
- 优秀开源平台,前后端分离快速开发平台,一站式多端开发(PC+APP)
- Appium环境安装
- Appium定位方式
- .NetCore 3.1 Dapper