JDBC(Java資料庫連接性)是Java API,用於管理與資料庫的連接,發出查詢和命令以及處理從資料庫獲得的結果集。JDBC在1997年作為JDK 1.1的一部分發布,是為Java持久層開發的首批組件之一。
本文提供了JDBC的概述,然後是使用JDBC API將Java客戶端與輕量級關係資料庫SQLite連接的動手入門。
JDBC如何工作
JDBC作為基於C的ODBC(開放資料庫連接)API的替代產品而開發,提供了編程級別的接口,該接口處理Java應用程式與資料庫或RDBMS通信的機制。JDBC接口包括兩層:
1. JDBC API支持Java應用程式與JDBC管理器之間的通信。
2. JDBC驅動程序支持JDBC管理器和資料庫驅動程序之間的通信。
JDBC是您的應用程式代碼與之交互的通用API。下面是您正在使用的資料庫的JDBC兼容驅動程序。
圖1是Java持久層中JDBC的體系結構概述。
使用JDBC連接資料庫
Java生態系統中編程的幸運事實之一是,您可能會為所選的任何資料庫找到穩定的JDBC資料庫連接器。在本教程中,我們將使用SQLite來了解JDBC,主要是因為它非常易於使用。
使用JDBC連接資料庫的步驟如下:
1. 安裝或找到您要訪問的資料庫。
2. 包括JDBC庫。
3. 確保所需的JDBC驅動程序在類路徑中。
4. 使用JDBC庫獲得與資料庫的連接。
5. 使用該連接來發出SQL命令。
6. 完成後關閉連接。
我們將一起完成這些步驟。
查找JDBC驅動程序
要查找您要使用的資料庫的驅動程序,只需對資料庫和JDBC進行網絡搜索。例如,輸入「 mysql jdbc driver」將打開MySQL驅動程序。我挑戰您尋找沒有JDBC驅動程序的Java兼容資料庫!
步驟1.下載並安裝SQLite
SQLite是一個非常緊湊的資料庫。它不是供生產使用的,但是快速嘗試問題的絕佳選擇。SQLite使用文件作為其功能資料庫,而無需安裝任何服務或守護程序。
要開始進行此演示,請繼續下載SQLite示例資料庫。解壓縮.db文件並將其保存在您不會忘記的地方。
該文件包含一個基於功能文件的資料庫以及我們可以使用的示例架構和數據。
SQL和JDBC
在過去的十年中,NoSQL變得越來越流行,但是關係資料庫仍然是使用中最常見的數據存儲類型。一個關係型資料庫是由列和行的表的結構化存儲庫。SQL(結構化查詢語言)是數據架構師用於在關係資料庫中創建,讀取,更新和刪除新記錄之類的語言。JDBC是從Java到SQL 的適配器層:它為Java開發人員提供了一個公共接口,用於連接資料庫,發出查詢和命令以及管理響應。
步驟2.將JDBC導入Java應用程式
我們可以在IDE中進行編碼,但是直接在文本編輯器中進行編碼將更好地展示JDBC的簡單性。首先,您需要為您的作業系統安裝兼容的JDK。
假設您已安裝Java平臺開發人員工具,我們可以從創建一個簡單的Java程序開始。在您的文本編輯器中,粘貼清單1中所示的代碼。調用此文件WhatIsJdbc.java。
清單1.一個簡單的Java程序
classWhatIsJdbc{
publicstaticvoidmain(String args[]){
System.out.println("Hello JavaWorld");
}}
現在,通過輸入以下命令來編譯代碼:javac WhatIsJdbc.java。編譯將輸出WhatIsJdbc.class文件。使用以下命令從命令行執行此文件:java WhatIsJdbc。
(有關在命令行上與JDK交互的更多信息,請參見「 什麼是JDK?Java開發者工具包簡介」。)
一旦有了基本的Java程序,就可以包括JDBC庫。將清單2中的代碼粘貼到簡單Java程序的開頭。
清單2. JDBC導入
importjava.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement;
這些導入中的每一個都提供對類的訪問,該類促進了標準Java資料庫連接:
· Connection 表示與資料庫的連接。
· DriverManager獲取與資料庫的連接。(另一個選項是DataSource,用於連接池。)
· SQLException 處理Java應用程式和資料庫之間的SQL錯誤。
· ResultSet並對Statement數據結果集和SQL語句建模。
我們將很快看到其中的每一個。
步驟3.將JDBC驅動程序添加到您的類路徑中
接下來,您將SQLite驅動程序添加到您的類路徑中。一個JDBC驅動程序是一個類,實現JDBC API為特定的資料庫。
從GitHub 下載SQLite驅動程序。確保獲取最新.jar文件並將其存儲在您會記得的地方。
下次執行Java程序時,將.jar通過類路徑將該文件拉入。有幾種設置類路徑的方法。清單3顯示了如何使用命令行開關來做到這一點。
清單3.在Java類路徑上執行SQLite驅動程序
java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc
注意,我們將類路徑設置為指向驅動程序和本地目錄。這樣,Java仍會找到我們的類文件。
步驟4.獲得資料庫連接
現在,類路徑可以訪問驅動程序。現在,更改您的簡單Java應用程式文件,使其類似於清單4中的程序。
清單4.使用JDBC Connection類連接到SQLite
importjava.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement;
classWhatIsJdbc{
publicstaticvoidmain(String[] args) {
Connectionconn = null;
try{
Stringurl = "jdbc:sqlite:path-to-db/chinook/chinook.db";
conn = DriverManager.getConnection(url);
System.out.println("Got it!");
} catch (SQLException e) {
thrownewError("Problem", e);
} finally {
try{
if(conn != null) {
conn.close();
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}}
編譯並執行此代碼。假設一切順利,您將得到一個肯定的消息。
找不到合適的驅動程序?
如果收到類似「」的錯誤,No suitable driver found for jdbc:sqlite則需要重新訪問類路徑並確保它指向您下載的驅動程序。驅動程序連接失敗是使用JDBC的初學者最常見的絆腳石。不要流汗。修復它。
現在,我們可以使用一些SQL命令了。
步驟5.查詢資料庫
有了實時連接對象,我們可以做一些有用的事情,例如查詢資料庫。清單5顯示了如何使用JDBC Connection和Statement對象查詢SQLite 。
清單5.使用JDBC查詢資料庫
importjava.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement;
classWhatIsJdbc{
publicstaticvoidmain(String[] args) {
Connectionconn = null;
try{
Stringurl = "jdbc:sqlite:path-to-db-file/chinook/chinook.db";
conn = DriverManager.getConnection(url);
Statementstmt = null;
Stringquery = "select * from albums";
try{
stmt = conn.createStatement();
ResultSetrs = stmt.executeQuery(query);
while(rs.next()) {
Stringname = rs.getString("title");
System.out.println(name);
}
} catch (SQLException e ) {
thrownewError("Problem", e);
} finally {
if(stmt != null) { stmt.close(); }
}
} catch (SQLException e) {
thrownewError("Problem", e);
} finally {
try{
if(conn != null) {
conn.close();
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}}
在清單5中,我們使用Connection對象獲得一個Statement對象:conn.createStatement()。然後,我們使用此對象執行SQL查詢:stmt.executeQuery(query)。
該executeQuery命令返回一個ResultSet對象,然後我們用它來對進行數據迭代while (rs.next())。在此示例中,您應該看到我們查詢的專輯標題作為輸出。
請注意,我們還通過調用來關閉連接conn.close()。
與JDBC的網絡連接
清單5中的資料庫連接字符串用於本地連接:jdbc:sqlite:path-to-db-file/chinook/chinook.db。要通過網絡訪問資料庫,連接字符串將需要包括網絡URL和(通常)用於訪問資料庫的憑據。
使用JDBC做更多的事情
到目前為止,我們已經介紹了使用JDBC連接資料庫和發出SQL命令的基礎知識。雖然StatementsS和ResultSetS代表常見的場景很好地工作,你可能需要用更大或更複雜的應用程式的附加選項。幸運的是,JDBC庫不斷發展以滿足大多數資料庫訪問需求。
準備聲明
一種提高代碼靈活性的簡單方法是用替換Statement類PreparedStatement,如清單6所示。
清單6.使用JDBC PreparedStatements
StringprepState = "insert into albums values (?, ?);";
PreparedStatementprepState =
connection.prepareStatement(sql);
prepState.setString(1, "Uprising");
prepState.setString(2, "Bob Marley and the Wailers ");
introwsAffected = preparedStatement.executeUpdate();
PreparedStatement用Statement問號(?)替換的硬編碼值。使用PreparedStatements可優化代碼的重用性:a PreparedStatement僅被編譯一次,然後可以與各種參數一起重用。隨著代碼庫的增長,您只需在語句中插入新值,而不用修改字符串對象本身。
批量更新
每當應用程式要發布多個更新時,分批執行它們可以極大地提高性能。批處理的實質是獲取多個更新並將它們收集在一起,然後一次發布所有更新。清單7使用JDBC的批處理方法來執行幾個PreparedStatements 的批處理更新。
清單7.使用PreparedStatement進行批處理
prepState.setString(1, "Uprising");
prepState.setString(2, "Bob Marley and the Wailers");
preparedStatement.addBatch();
prepState.setString(1, "Wildflowers");
prepState.setString(2, "Tom Petty and the Heartbreakers");
preparedStatement.addBatch();
int[] rowsAffected = preparedStatement.executeBatch();
JDBC事務
關係資料庫中的事務允許將一組更新包裝在完全成功或失敗的交互中。通過JDBC使用事務的基礎是告訴系統關閉自動提交,然後在完成後手動告訴系統進行提交。默認情況下,自動提交功能為on,這意味著無論何時運行executeUpdate或executeInsert,命令都會被提交。
清單8顯示了JDBC事務的一小部分。
清單8. JDBC事務
connection.setAutoCommit(false);// Use executeUpdate multiple times
connection.commit();
當connection.commit()遇到,所有包裹在裡面的更新將嘗試,如果有任何失敗,他們都將被回滾。
JDBC 4.3中還有許多值得探索的功能,包括CallableStatement用於存儲過程,使用DataSource對象以提高應用程式性能(尤其是通過連接池),以及將JDBC ResultSet轉換為Java Stream。
特定於資料庫的功能
儘管每個符合JDBC的資料庫都提供了相同的核心功能,以便通過SQL與資料庫連接和交互,但是某些資料庫的作用要比其他資料庫大。例如,Oracle DB提供了結果緩存,這不是JDBC規範所必需的。這是一個例子:
conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1");
結論
JDBC是Java最古老的API之一,它為Java應用程式開發的長期需求之一提供了易於使用的解決方案。僅了解本文演示的幾個JDBC調用,即可開始使用JDBC連接幾乎所有的資料庫。完成這些命令後,就可以開始探索JDBC中內置的一些更複雜的選項。
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。