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