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祝您面試順利,並祝您未來一切順利!乾杯 :-)

廣告