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