如何使用JDBC操作數(shù)據(jù)庫?一文帶你吃透JDBC規(guī)范
文章目錄
1. 前言
2. JDBC 概述
2.1 概念
2.2 優(yōu)點(diǎn)
3. JDBC 快速入門
4. JDBC API詳解
??? 4.1 DriverManager
??????? 4.1.1 注冊驅(qū)動(dòng)
??????? 4.1.2 獲取連接
??? 4.2 Connection
??????? 4.2.1 獲取執(zhí)行sql的對象
??????? 4.2.2 事務(wù)管理
??? 4.3 Statement
??? 4.4 ResultSet
??? 4.5 PreparedStatement
??????? 4.5.1 sql注入問題
??????? 4.5.2 preparedStatement 原理
5. 數(shù)據(jù)庫連接池
??? 5.1 概念
??? 5.2 實(shí)現(xiàn)
6. Druid 連接池的使用
7. 準(zhǔn)備工作
8. 實(shí)戰(zhàn)案例
9. 增刪改查操作練習(xí)
??? 9.1 查詢所有
??? 9.2 添加數(shù)據(jù)
??? 9.3 修改數(shù)據(jù)
??? 9.4 刪除數(shù)據(jù)
10. 總結(jié)
??橙子精品文章學(xué)習(xí)推薦
1. 前言
大家好,我是橙子。最近又肝了幾個(gè)大夜,總結(jié)了 JDBC 完整版的基礎(chǔ)教程和實(shí)戰(zhàn)案例訓(xùn)練??靵砜纯催@些 Java 基礎(chǔ)性的代碼你有沒有忘記?

在 Java 開發(fā)中,使用 Java 語言操作數(shù)據(jù)庫是非常重要的一部分,那么 Java 語言是如何操作數(shù)據(jù)庫的呢?
我們需要使用不同廠商的數(shù)據(jù)庫時(shí),例如 MySQL,Oracle 等,顯然一套 Java 代碼是不能同時(shí)操作不同的數(shù)據(jù)庫的,那么怎樣實(shí)現(xiàn)一套 Java 代碼對不同的數(shù)據(jù)庫的操作呢?

JDBC 應(yīng)運(yùn)而生,JDBC 是使用 Java 語言操作關(guān)系型數(shù)據(jù)庫的一套 API,其中定義了對數(shù)據(jù)庫操作的規(guī)范,這里的規(guī)范在 Java 中就是指接口,不同的數(shù)據(jù)庫廠商提供了不同的 JDBC 實(shí)現(xiàn)類,稱為驅(qū)動(dòng),使用時(shí),只需要導(dǎo)入需要的數(shù)據(jù)庫驅(qū)動(dòng) jar 包,便可以操作不同的關(guān)系型數(shù)據(jù)庫,其實(shí)際是使用了 jar 包中的實(shí)現(xiàn)類。
本系列文章的學(xué)習(xí)目標(biāo):
??? 什么是 JDBC,如何使用?
??? 使用 JDBC 完成數(shù)據(jù)的增刪改查操作
??? JDBC API 熟練使用
學(xué)會(huì)使用Java代碼操作數(shù)據(jù)庫,本文是2 萬字學(xué)習(xí)教程,閱讀本文需要20 分鐘,建議收藏長期學(xué)習(xí)使用。
2. JDBC 概述
2.1 概念
JDBC , Java DataBase Connectivity , 是使用 Java 語言操作關(guān)系型數(shù)據(jù)庫的一套API。本質(zhì)上來說,JDBC 中定義了一套操作關(guān)系型數(shù)據(jù)庫的規(guī)范,但是我們不能直接使用這套接口來操作數(shù)據(jù)庫,于是各大數(shù)據(jù)庫廠商提供了 JDBC 不同的實(shí)現(xiàn)類,稱為驅(qū)動(dòng),例如 MySQL 驅(qū)動(dòng),此時(shí),我們只需要操作 JDBC 規(guī)范好的代碼便可以完成對數(shù)據(jù)庫的操作。在實(shí)現(xiàn)對數(shù)據(jù)庫的操作時(shí),其底層是使用了 jar 包中定義的實(shí)現(xiàn)類。

當(dāng)我們使用不同的數(shù)據(jù)庫時(shí),例如測試時(shí)使用 MySQL 數(shù)據(jù)庫,部署時(shí)使用 Oracle 數(shù)據(jù)庫,只需要編寫一套 Java 代碼便可以實(shí)現(xiàn)對不同關(guān)系型數(shù)據(jù)庫的操作。
2.2 優(yōu)點(diǎn)
使用 JDBC 操作關(guān)系型數(shù)據(jù)庫時(shí),各大數(shù)據(jù)庫廠商提供了不同的實(shí)現(xiàn)類,我們不需要針對不同的數(shù)據(jù)庫進(jìn)行單獨(dú)開發(fā),因此,我們也可以隨時(shí)替換數(shù)據(jù)庫,而不用大量修改 Java 代碼。
我們只需要在使用時(shí)導(dǎo)入需要使用的數(shù)據(jù)庫對應(yīng)的驅(qū)動(dòng) jar包到項(xiàng)目中,便可以實(shí)現(xiàn)對指定數(shù)據(jù)庫的操作,使 Java 操作數(shù)據(jù)庫變得輕松便捷。
下圖就是MySQL的驅(qū)動(dòng)jar包:

不同版本的 jar 包可以在官網(wǎng)下載。
3. JDBC 快速入門
使用 Java 語言操作數(shù)據(jù)庫,實(shí)際上就是 Java 代碼將 sql 語句發(fā)送到 MySQL 數(shù)據(jù)庫服務(wù)端,MySQL 服務(wù)端接收并執(zhí)行 sql 語句,同時(shí)返回一個(gè)執(zhí)行結(jié)果,最后該結(jié)果會(huì)發(fā)送到 Java 代碼進(jìn)行處理。
對數(shù)據(jù)庫的操作大致分為以下幾個(gè)步驟:
注冊驅(qū)動(dòng)
獲取連接
編寫sql
獲取執(zhí)行sql對象
執(zhí)行sql
處理返回結(jié)果
釋放資源
在進(jìn)行編碼之前,需要先創(chuàng)建工程,導(dǎo)入數(shù)據(jù)庫的驅(qū)動(dòng) jar 包。這里以 JDBC 操作 MySQL 數(shù)據(jù)庫為例,步驟如下:
創(chuàng)建空項(xiàng)目,定義項(xiàng)目名稱及路徑:

在File / Project Structure 中進(jìn)行項(xiàng)目設(shè)置,JDK版本,編譯版本等:

創(chuàng)建新模塊,指定名稱及位置:

在 jdbc-demo 模塊中新建 Lib 文件夾:

將下載好的 MySQL驅(qū)動(dòng) jar 包導(dǎo)入 Lib 目錄下作為庫文件:

右鍵 MySQL 驅(qū)動(dòng) jar 包,點(diǎn)擊 Add as Library ,并選擇模塊下有效:

創(chuàng)建好工程以后,就可以編寫代碼操作數(shù)據(jù)庫啦!
在 idea 中右鍵 src / new / Java Class ,輸入類名 JDBCDemo 創(chuàng)建一個(gè)新的類。
第一步:注冊驅(qū)動(dòng)
目的是把 Driver 類加載到內(nèi)存中。其實(shí),Java 中用于注冊驅(qū)動(dòng)的是 registerDriver() 方法,而在 Driver 類中使用了該方法,所以只要把 Driver 類加載到內(nèi)存中 ,包含 registerDriver 方法的靜態(tài)代碼塊就會(huì)執(zhí)行,驅(qū)動(dòng)就會(huì)被注冊。我們可以查看JDK源碼中的Driver 類:
第二步:獲取連接
目的是通過 getConnection() 方法獲取數(shù)據(jù)庫連接 Connection 類對象,這里沒有直接把數(shù)據(jù)傳入方法之中,而是定義了三個(gè)局部變量,url,數(shù)據(jù)庫用戶名和密碼,其中 url 參數(shù)有固定的語法格式:
第三步:定義sql
目的是定義操作數(shù)據(jù)庫的 sql 語句。
第四步:獲取執(zhí)行sql的對象
目的是在執(zhí)行 sql 語句之前,先獲取執(zhí)行 sql 的對象 statement。
第五步:執(zhí)行sql
目的是為了將 sql 發(fā)送到數(shù)據(jù)庫服務(wù)端,讓數(shù)據(jù)庫服務(wù)端執(zhí)行完 sql,并且返回一個(gè)結(jié)果,這里的 executeUpdate() 返回受影響的行數(shù)。
第六步:處理返回結(jié)果
目的是處理數(shù)據(jù)庫服務(wù)端返回的 sq l執(zhí)行結(jié)果,這里我們打印了 executeUpdate() 方法返回的受影響的行數(shù)。
第七步:釋放資源
目的是在完成對數(shù)據(jù)庫的操作以后釋放資源,否則數(shù)據(jù)庫文件將一直被被程序占用,釋放資源時(shí)遵循先開后釋放的原則。
使用 JDBC 操作 MySQL 數(shù)據(jù)庫完整代碼:
4. JDBC API詳解
4.1 DriverManager
DriverManager
,驅(qū)動(dòng)管理類。在 JDBC 入門篇中,我們使用了該類的方法來注冊驅(qū)動(dòng)和獲取連接。
DriverManager 類主要有兩個(gè)作用:
注冊驅(qū)動(dòng)
獲取連接
4.1.1 注冊驅(qū)動(dòng)
在 Driver 類靜態(tài)代碼塊中 DriverManager 類執(zhí)行了其 registerDriver() 方法用于注冊驅(qū)動(dòng),當(dāng)我們把類Driver 加載到內(nèi)存中后,該靜態(tài)代碼塊就會(huì)執(zhí)行,此時(shí)就完成了驅(qū)動(dòng)注冊,我們就是使用這樣的方法注冊驅(qū)動(dòng)的。查看 JDK 源碼就不難理解:
需要注意的是,在 MySQL 5 以后的驅(qū)動(dòng) jar 包可以不用進(jìn)行此步驟來注冊驅(qū)動(dòng),當(dāng)我們把 jar 導(dǎo)入到項(xiàng)目以后,程序會(huì)自動(dòng)加載 jar 包中 META-INF/services/java.sql.Driver
文件中的驅(qū)動(dòng)類。
4.1.2 獲取連接
我們使用 DriverManager 類的 getConnection() 靜態(tài)方法來獲取數(shù)據(jù)庫連接對象,其方法有三個(gè)參數(shù),分別是 url,數(shù)據(jù)庫的用戶名和密碼。url 有其固定的語法格式:
例如:
這里 useSSL = false 關(guān)閉了安全連接方式,解決了 idea 警告的問題。
4.2 Connection
Connection
,數(shù)據(jù)庫連接對象接口。在入門篇中使用了該類獲取 sql 的執(zhí)行對象 statement。
Connection 接口的作用有:
獲取執(zhí)行 SQL 的對象
管理事務(wù)
4.2.1 獲取執(zhí)行sql的對象
Connection 中的 createStatement() 方法可以獲取執(zhí)行 sql 的對象 Statement ,用于把 sql 發(fā)送到數(shù)據(jù)庫服務(wù)端。使用 preparedStatement() 方法可以獲取預(yù)編譯 sql 的執(zhí)行 sql 的對象,這個(gè)方法可以有效的防止 sql 注入的問題。
4.2.2 事務(wù)管理
在JDBC 中使用 Connection 對象進(jìn)行事務(wù)管理,Connection 中定義了三個(gè)對應(yīng)的方法:
開啟事務(wù):
回滾事務(wù):
提交事務(wù):
示例:
我們使用 Java 中的異常捕獲機(jī)制來進(jìn)行事務(wù)的管理。將執(zhí)行 sql 的語句放在 try 代碼塊中,并且使用 setAutoCommit() 方法開啟事務(wù),如果代碼塊中沒有出現(xiàn)異常,則使用 commit() 方法提交事務(wù),如果 try 代碼塊某處出現(xiàn)了異常,則需要回滾事務(wù),所以將回滾事務(wù)的 rollback() 方法定義在 catch 語句塊中。
4.3 Statement
Statement 類的對象用來執(zhí)行 sql 語句,即把 sql 發(fā)送到數(shù)據(jù)庫服務(wù)端,但是使用此類對象執(zhí)行 sql 會(huì)出現(xiàn) sql 注入的問題。不同的 sql 語句使用不同的方法執(zhí)行,執(zhí)行 DDL,DML 語句使用下面的方法:
在執(zhí)行 DML 語句完成對數(shù)據(jù)的增刪改操作時(shí),該方法返回?cái)?shù)據(jù)表中受影響的行數(shù),可以使用這個(gè)返回值來判斷是否成功完成對數(shù)據(jù)的操作。而使用 DDL 來操作數(shù)據(jù)庫和數(shù)據(jù)表時(shí),返回值可能為 0,所以不能用作上面的判斷,且在開發(fā)中 DDL 很少被用到。
示例1,使用 DML 修改數(shù)據(jù):
示例2,使用 DDL 刪除數(shù)據(jù)庫:
此時(shí),控制臺返回了 0 ,但是對數(shù)據(jù)庫的刪除操作已經(jīng)完成。

執(zhí)行 DQL 語句時(shí)需要使用下面的方法:
該方法在下面 ResultSet類中講解。
4.4 ResultSet
ResultSet
,結(jié)果集對象類,其作用是封裝 sql 查詢語句的結(jié)果。執(zhí)行了 DQL 查詢語句后就會(huì)返回該類的對象,執(zhí)行 DQL 語句的方法如下:
ResultSet 類提供了操作查詢結(jié)果數(shù)據(jù)的方法,如下:
操作查詢結(jié)果數(shù)據(jù)的方法如下圖:

一開始指針位于第一行前,如圖所示紅色箭頭指向于表頭行。當(dāng)我們調(diào)用了 next() 方法后,指針就下移到第一行數(shù)據(jù),并且方法返回 true,此時(shí)就可以通過 getInt("id") 獲取當(dāng)前行 id 字段的值,也可以通過 getString("name") 獲取當(dāng)前行 name 字段的值。如果想獲取下一行的數(shù)據(jù),繼續(xù)調(diào)用 next() 方法,以此類推。獲取某個(gè)字段的值時(shí),既可以傳入 int 類型,即列的編號,也可以傳入列對應(yīng)的字段名。
示例,查詢 account 表中數(shù)據(jù),并且打印所有結(jié)果:
4.5 PreparedStatement
4.5.1 sql注入問題
前面 statement 類的對象用來執(zhí)行sql語句,例如 :
但是使用此方法存在 sql 注入的問題,什么是 sql 注入呢?這里做一個(gè)大致的講解。
SQL注入是通過操作輸入來修改事先定義好的 sql 語句,用來達(dá)到執(zhí)行代碼對服務(wù)器進(jìn)行攻擊的方法。例如,在程序的登錄操作中,用戶輸入的用戶名和密碼會(huì)被發(fā)送到 Java 代碼,然后用于 Java 操作數(shù)據(jù)庫的sql 語句中,只有當(dāng)用戶輸入的用戶名和密碼與數(shù)據(jù)庫中的數(shù)據(jù)匹配時(shí)才能實(shí)現(xiàn)登錄,但是,只要我們輸入事先定義好的語句,便可以進(jìn)行破解。例如下面拼字符串的方式修改 sql 語句原來的含義:
此時(shí),將用戶名和密碼拼接到 sql 中,如下:
可以看到,sql 中的判斷條件永遠(yuǎn)為 true ,不管輸入什么樣的用戶名,這條 sql 都成立,實(shí)現(xiàn)了 sql 注入。

為了解決這個(gè)問題,出現(xiàn)了 preparedStatement ,該類用于預(yù)編譯 sql 語句并執(zhí)行,其優(yōu)點(diǎn)是可以防止sql 注入,并且預(yù)編譯sql提高了性能。其實(shí)底層是將特殊字符進(jìn)行了轉(zhuǎn)義,轉(zhuǎn)義的 sql 如下:
示例:

4.5.2 preparedStatement 原理
前面使用 preparedStatement 解決了 sql 注入的問題,其實(shí)我們還沒有開啟預(yù)編譯的功能,JDBC 中是如何通過預(yù)編譯來提高性能的呢?
要學(xué)習(xí) prepareStatement 實(shí)現(xiàn)預(yù)編譯的原理,首先要明白 Java 操作數(shù)據(jù)庫的步驟:
首先 Java 代碼將 sql 發(fā)送到 MySQL 服務(wù)端,MySQL 服務(wù)端接收到 sql 語句以后,會(huì)對 sql 語句進(jìn)行檢查(檢查 sql 語句的語法),編譯(編譯 sql 語句,將 sql 語句編譯成可執(zhí)行的函數(shù)),執(zhí)行的操作。而檢查和編譯 sql 語句花費(fèi)的時(shí)間往往較長,如果想要提高 sql 的性能,就可以從這方面入手。在使用預(yù)編譯的方法時(shí),檢查和編譯 sql 語句的操作將會(huì)在獲取執(zhí)行 sql 的對象時(shí)完成,并且不會(huì)重復(fù)執(zhí)行,從而提高了性能。

要想打開預(yù)編譯的功能,就需要在 url 中設(shè)置如下的參數(shù):
示例:
在獲取 sql 的執(zhí)行對象時(shí),sql 會(huì)作為參數(shù)被發(fā)送到 MySQL 服務(wù)端進(jìn)行檢查和編譯,在執(zhí)行時(shí),不再進(jìn)行第二次檢查和編譯的操作,提高了 sql 執(zhí)行的性能。
5. 數(shù)據(jù)庫連接池
5.1 概念
前面在 JDBC API 詳解中,獲取的數(shù)據(jù)庫連接對象 conn,在使用時(shí)創(chuàng)建,使用完畢就會(huì)將其銷毀。這樣重復(fù)創(chuàng)建和銷毀的過程實(shí)際上是消耗性能和時(shí)間的,當(dāng)大量用戶訪問數(shù)據(jù)庫時(shí),每次都要進(jìn)行數(shù)據(jù)庫連接對象的創(chuàng)建和銷毀,對系統(tǒng)來說是一種大量的消耗。那么我們怎樣來提升性能和節(jié)省時(shí)間呢?

我們使用數(shù)據(jù)庫連接池來重復(fù)利用數(shù)據(jù)庫的連接對象,即 Connection 類對象。

數(shù)據(jù)庫連接池是一個(gè)負(fù)責(zé)分配,管理數(shù)據(jù)庫連接對象的容器,它允許應(yīng)用程序重復(fù)使用同一個(gè)數(shù)據(jù)庫連接對象。數(shù)據(jù)庫連接池可以釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接對象來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接對象而引起的數(shù)據(jù)庫連接遺漏。

連接池是在一開始就創(chuàng)建好了一些連接對象存儲起來,用戶需要連接數(shù)據(jù)庫時(shí),不需要自己創(chuàng)建連接對象,而只需要從連接池中獲取一個(gè)連接對象進(jìn)行使用,使用完畢后再將連接對象歸還給連接池。這樣就可以起到資源重用的作用,也節(jié)省了頻繁創(chuàng)建連接銷毀連接所花費(fèi)的時(shí)間,從而提升了系統(tǒng)響應(yīng)的速度。
總結(jié)來說使用數(shù)據(jù)庫連接池有以下幾點(diǎn)好處:
實(shí)現(xiàn)資源重用
提升系統(tǒng)響應(yīng)速度
避免數(shù)據(jù)庫連接遺漏
5.2 實(shí)現(xiàn)
sun 公司提供了數(shù)據(jù)庫連接池的標(biāo)準(zhǔn)接口 DataSource
,我們一般使用第三方實(shí)現(xiàn)該接口的實(shí)現(xiàn)類,所有實(shí)現(xiàn)類都繼承了其獲取連接的方法:
常見的數(shù)據(jù)庫連接池有:
Druid(德魯伊)
C3P0
DBCP
使用了數(shù)據(jù)庫連接池以后,在獲取數(shù)據(jù)庫連接對象時(shí)不需要通過 DriverManager類的 getConnection() 方法,而是直接從數(shù)據(jù)庫連接池中獲取。我們今天要使用的是 Druid 連接池,它是阿里巴巴開源的數(shù)據(jù)庫連接池項(xiàng)目,其功能強(qiáng)大,性能優(yōu)秀,使用占比高,是一款優(yōu)秀的數(shù)據(jù)庫連接池。
6. Druid 連接池的使用
下面以 Druid 連接池為例,講解通過數(shù)據(jù)庫連接池獲取數(shù)據(jù)庫連接對象,主要有以下幾個(gè)步驟:
導(dǎo)入Druid 連接池的 jar 包
定義配置文件
加載配置文件
獲取數(shù)據(jù)庫連接池對象
獲取連接
第一步:將 Druid 的 jar 包放入項(xiàng)目中的 Lib 目錄下作為庫文件,jar 包自行下載。

選擇 Add as Library,選擇模塊下有效:

第二步:編寫配置文件,在 src 目錄下創(chuàng)建文件 druid.properties
。
Druid 配置文件中有很很多的參數(shù),這里配置了用到的幾項(xiàng),其中有連接數(shù)據(jù)庫的名稱和密碼,初始連接數(shù),最大連接數(shù),最大等待時(shí)間等,超過了最大等待時(shí)間配置文件還沒有加載成功的話,程序就會(huì)報(bào)錯(cuò)。
第三步:在代碼中加載配置文件
第四步:在代碼中獲取連接池對象
第五步:獲取數(shù)據(jù)庫連接對象
示例,Druid的使用完整代碼:
運(yùn)行結(jié)果:

其中,DruidDataSourceFactory 類中的 createDataSource()
方法既可以傳入一個(gè) Map 集合,也可以傳入 prop 對象,其中都存放配置信息,用來獲取連接池對象。
小tips:如果代碼中文件的相對路徑報(bào)錯(cuò),可以使用
System.getProperty("user.dir")
獲取項(xiàng)目的當(dāng)前路徑。

7. 準(zhǔn)備工作
前面我們說過,在 Java 代碼中,執(zhí)行 sql 查詢語句以后返回一個(gè) ResultSet 類的對象,并且 ResultSet 類提供了方法讓我們可以操作查詢結(jié)果數(shù)據(jù),例如可以直接打印所有查詢的數(shù)據(jù)。
示例:
運(yùn)行結(jié)果:

顯然這樣并不是我們想要的效果,數(shù)據(jù)零散不好處理。所以我們可以把每條數(shù)據(jù)封裝為一個(gè)實(shí)體類的對象,每個(gè)對象對應(yīng)數(shù)據(jù)庫表的一條記錄,并且把每個(gè)對象放到集合中存儲。練習(xí)使用的數(shù)據(jù)庫表:
在 Navicat 中查看數(shù)據(jù)表:

8. 實(shí)戰(zhàn)案例
查詢學(xué)生信息表數(shù)據(jù),封裝為 Student 類對象,并存放在 ArrayList 集合中。
思路:要解決這個(gè)問題,大概分為以下幾個(gè)步驟:
創(chuàng)建一個(gè) Student 實(shí)體類
查詢數(shù)據(jù)庫中的數(shù)據(jù),并且賦值給對象的屬性
將對象存儲到 ArrayList 集合中
第一步:創(chuàng)建一個(gè)Student 實(shí)體類,并定義 set() 方法,重寫 Object 類中的 toString 方法,方便查看打印效果。
小tips :在 idea 中使用 Alt + Inset 快捷鍵可以快速給類添加或重寫一些方法,例如 get() ,set() ,toString() 方法等。使用 Ctrl + 鼠標(biāo)左鍵可以快速選擇多項(xiàng)方法。
第二步:使用 Java 代碼操作數(shù)據(jù)庫,查詢數(shù)據(jù)庫表中所有學(xué)生信息并通過 set() 方法賦值給 Student 類的對象,將對象存儲到集合中。
運(yùn)行結(jié)果:

這樣,我們的程序就達(dá)到了預(yù)期的效果,將來需要使用的數(shù)據(jù)全部封裝為對象并存放在了集合中。
9. 增刪改查操作練習(xí)
在數(shù)據(jù)庫連接池入門篇中,我們學(xué)習(xí)了 Druid 連接池的使用,數(shù)據(jù)庫連接池允許重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接對象,提升了系統(tǒng)的響應(yīng)速度和時(shí)間。下面我們使用數(shù)據(jù)庫連接池來練習(xí)解決上面的問題,并且在獲取 sql 執(zhí)行對象時(shí),我們使用 PreparedStatement 類,解決sql 注入的問題。
9.1 查詢所有
查詢所有數(shù)據(jù),并把查詢結(jié)果數(shù)據(jù)封裝為對象存儲在集合中,這里的數(shù)據(jù)表,Student 實(shí)體類和上面例子中相同。
9.2 添加數(shù)據(jù)
現(xiàn)在演示往數(shù)據(jù)庫中添加一條記錄,應(yīng)用場景為用戶在客戶端輸入一條數(shù)據(jù)時(shí),我們需要將數(shù)據(jù)添加到數(shù)據(jù)庫。示例:

此時(shí)的數(shù)據(jù)表:

9.3 修改數(shù)據(jù)
現(xiàn)在數(shù)據(jù)表中的數(shù)據(jù),應(yīng)用場景為用戶在客戶端修改數(shù)據(jù),對應(yīng)數(shù)據(jù)庫中的數(shù)據(jù)也要完成修改。示例:

此時(shí)的數(shù)據(jù)表:

9.4 刪除數(shù)據(jù)
下面演示刪除數(shù)據(jù),用戶在客戶端選擇刪除某條數(shù)據(jù)記錄時(shí),數(shù)據(jù)庫中的數(shù)據(jù)也要完成刪除操作。示例:

此時(shí)的數(shù)據(jù)表:

10. 總結(jié)
學(xué)習(xí)完這篇文章,你將學(xué)會(huì)使用 Java 代碼操作數(shù)據(jù)庫,包括數(shù)據(jù)庫的連接,創(chuàng)建,數(shù)據(jù)的增刪改查等操作。
JDBC 作為基礎(chǔ)性的代碼,在開發(fā)中其實(shí)存在著很多的缺點(diǎn),所以在開發(fā)中并不會(huì)直接使用,而一般會(huì)使用框架開發(fā),使用框架開發(fā)不僅能夠提高開發(fā)的效率,而且大大提高了代碼的規(guī)范性。MyBatis 就是一款優(yōu)秀的持久層框架,專門用來簡化 JDBC 開發(fā),后面我們馬上會(huì)接觸到,但是在這之前,一定要先熟練 JDBC 的使用。

最后
??? 小伙伴們學(xué)習(xí)編程,有時(shí)候不知道怎么學(xué),從哪里開始學(xué)。掌握了基本的一些語法或者做了兩個(gè)案例后,不知道下一步怎么走,不知道如何去學(xué)習(xí)更加高深的知識。
那么對于這些小伙伴們,我準(zhǔn)備了大量的視頻教程,PDF電子書籍,以及源代碼!
只要+up主威信wangkeit1備注“B站”就可以白嫖領(lǐng)取啦!
