Java連接MySQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)交互的示例
1.0 JDBC 概述
JDBC(Java Database Connectivity)是 Java 編程語(yǔ)言用于與數(shù)據(jù)庫(kù)進(jìn)行交互的標(biāo)準(zhǔn) API。它提供了一種統(tǒng)一的方式來(lái)訪問(wèn)不同數(shù)據(jù)庫(kù)系統(tǒng),并執(zhí)行 SQL 查詢、更新和管理數(shù)據(jù)庫(kù)。
通過(guò) JDBC,開(kāi)發(fā)人員可以輕松地連接到數(shù)據(jù)庫(kù)、執(zhí)行 SQL 查詢、管理事務(wù)、處理異常等,實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的數(shù)據(jù)交互和管理。
簡(jiǎn)單來(lái)說(shuō),Java 提出的一套關(guān)于數(shù)據(jù)庫(kù)操作的接口,各個(gè)數(shù)據(jù)庫(kù)廠商要把自己的 API 對(duì)接到適配到 JDBC 上。程序元只需要掌握一套 API 就可以操作不同的數(shù)據(jù)庫(kù)了。
2.0 實(shí)現(xiàn) Java 連接 MySQL 數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)交互的完整過(guò)程
2.1 安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)包
數(shù)據(jù)庫(kù)廠商提供的這個(gè)原生 API 適配到 JDBC 轉(zhuǎn)換程序,稱為“數(shù)據(jù)庫(kù)驅(qū)動(dòng)包”。需要下載這個(gè) .jar 文件,一個(gè) .jar 文件通常包含了數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)的 JDBC 接口。一個(gè) .jar 文件是用來(lái)提供 JDBC 接口的實(shí)現(xiàn),以便 Java 程序可以通過(guò) JDBC API 與數(shù)據(jù)庫(kù)進(jìn)行交互??梢酝ㄟ^(guò)中央倉(cāng)庫(kù)來(lái)下載數(shù)據(jù)庫(kù)驅(qū)動(dòng)包:https://mvnrepository.com/
接著將 .jar 文件導(dǎo)入到 Java 文件目錄中
1)接著,將 .jar 文件復(fù)制粘貼到 Java 文件目錄中:
2)最后,右擊 .jar 文件再點(diǎn)擊添加為庫(kù):
3)添加成功的展示:
2.2 創(chuàng)建數(shù)據(jù)源對(duì)象
創(chuàng)建數(shù)據(jù)源是在應(yīng)用程序中連接到數(shù)據(jù)庫(kù)的一種常見(jiàn)方法。數(shù)據(jù)源通常是一個(gè)對(duì)象,它包含了連接數(shù)據(jù)庫(kù)所需的信息,如 MySQL 數(shù)據(jù)庫(kù)地址、用戶名、密碼。不同的數(shù)據(jù)庫(kù)需要設(shè)置的參數(shù)有所不同。
在 Java 中創(chuàng)建數(shù)據(jù)源并且連接到數(shù)據(jù)庫(kù)服務(wù)器中相當(dāng)于實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)客戶端。
創(chuàng)建數(shù)據(jù)源代碼:
//1.0 創(chuàng)建數(shù)據(jù)源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("123456");
首先 new 一個(gè) MySQL 數(shù)據(jù)源,這里用到了向上轉(zhuǎn)型,利用了多態(tài)特性。創(chuàng)建完數(shù)據(jù)源的對(duì)象后,需要對(duì)屬性、方法進(jìn)行設(shè)置:由于每一個(gè)數(shù)據(jù)庫(kù)的方法都有所差別,需要用到向下轉(zhuǎn)型,來(lái)專門訪問(wèn)數(shù)據(jù)庫(kù)自己特有的方法、屬性。
比如,MySQL 中需要設(shè)置數(shù)據(jù)庫(kù)服務(wù)器資源路徑:
setUrl("jdbc:mysql://127.0.0.1:3306/數(shù)據(jù)庫(kù)名?characterEncoding=utf8&useSSL=false") :該路徑的大部分結(jié)構(gòu)是不用改變的,一般情況下,只有唯一的參數(shù),就是數(shù)據(jù)庫(kù)名稱。
setUser("用戶名"):設(shè)置用戶名,默認(rèn)情況是 root ,root 是權(quán)限最大的賬戶。
setPassword("密碼"):密碼輸入。
2.3 獲取數(shù)據(jù)庫(kù)連接對(duì)象
通過(guò)數(shù)據(jù)源對(duì)象獲取數(shù)據(jù)庫(kù)連接,以便在 Java 代碼中執(zhí)行數(shù)據(jù)庫(kù)操作。通過(guò)得到的數(shù)據(jù)源對(duì)象 dataSource 的方法 getConnection() 從而獲取數(shù)據(jù)庫(kù)連接該對(duì)象。
這個(gè) Connection 對(duì)象,就代表著客戶端與服務(wù)端之間的“連接對(duì)象”。
代碼如下:
//2.0 與數(shù)據(jù)庫(kù)建立聯(lián)系 Connection connection = dataSource.getConnection();
需要注意的是,getConnection() 屬于受查異常,可能會(huì)拋出 SQL Exception 異常。有兩種方法解決:第一種,聲明異常;第二種,捕獲異常處理。
一般來(lái)到這里,順利的話,就可以獲取 connection 對(duì)象了。
經(jīng)常出錯(cuò)的情況:
出錯(cuò)一:Connection 類型選錯(cuò)
很容易根據(jù)提示,會(huì)選擇錯(cuò)誤。正確的是選擇第一個(gè) Connection 是 JDBC 中的一個(gè)接口。
出錯(cuò)二: MySQL 版本與數(shù)據(jù)庫(kù)驅(qū)動(dòng)包的版本不一致導(dǎo)致的錯(cuò)誤
即使兩者之間的大版本相同,但是小版本不相同,可能也會(huì)出錯(cuò)。比如,MySQL8.0 的版本與 mysql-connector-java-8.0.7-dmr.jar 數(shù)據(jù)庫(kù)驅(qū)動(dòng)包,大版本都是 8.0 但是小版本不一致,也有可能出錯(cuò),從而導(dǎo)致連不上數(shù)據(jù)庫(kù)服務(wù)器,建議多試試幾個(gè)版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包。不過(guò)有其他方法來(lái)解決即使小版本不一致也可以正常連接上數(shù)據(jù)庫(kù)服務(wù)器。
其他原因有很多種,包括不限于:
1)數(shù)據(jù)庫(kù)服務(wù)器沒(méi)有正確啟動(dòng)
2)url 寫錯(cuò)了
3)用戶名寫錯(cuò)了
4)密碼寫錯(cuò)了
5)網(wǎng)絡(luò)斷開(kāi)了
補(bǔ)充:進(jìn)行客戶端 - 服務(wù)器之間通信的時(shí)候,常見(jiàn)有兩種通信的模式:
1)有連接(JDBC 屬于有連接):比如,打電話,需要對(duì)方接通電話才可以進(jìn)行對(duì)話,要是對(duì)方掛斷了,就沒(méi)通信了。
2)無(wú)連接:比如,微信發(fā)消息,不需要對(duì)方接通才能發(fā)送消息。無(wú)論對(duì)方是否接受,我都能把數(shù)據(jù)給發(fā)過(guò)去。
2.4 創(chuàng)建 SQL 語(yǔ)句
雖然是通過(guò) Java 來(lái)操作數(shù)據(jù)庫(kù),實(shí)際上核心還是 SQL ,只不過(guò)是把 SQL 語(yǔ)句嵌入帶 Java 中。
1)首先,用字符串的形式創(chuàng)建一條 SQL 語(yǔ)句。
2)接著,通過(guò)連接對(duì)象 connection 的方法 prepareStatement(字符串變量),將字符串進(jìn)行預(yù)編譯處理。
代碼如下:
// 3.0 創(chuàng)建SQL語(yǔ)句 String sql = "insert into student values('張三三',14)"; PreparedStatement preparedStatement = connection.prepareStatement(sql);
補(bǔ)充:如果一個(gè)字符串 sql 發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器上,是要先對(duì) sql 進(jìn)行解析,進(jìn)行各種校驗(yàn)(判定 sql 是否符合語(yǔ)法要求等),這個(gè)解析操作也是要花費(fèi)一定的開(kāi)銷,雖然開(kāi)銷不大,但是 mysql 服務(wù)器要同時(shí)給多個(gè)客戶端提供服務(wù),為了減輕數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),就可以在客戶端這邊完成,此時(shí)把解析后的結(jié)果發(fā)給服務(wù)器,服務(wù)器直接執(zhí)行即可。
若從控制臺(tái)輸入數(shù)據(jù),在 sql 語(yǔ)句中 values(?,?...) 用到 ? 占位符,通過(guò) preparedStatement 對(duì)象來(lái)設(shè)置值來(lái)對(duì)應(yīng) sql 語(yǔ)句中 ?的符號(hào)。
代碼如下:
public static void main(String[] args) throws SQLException { DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("123456"); Connection connection = dataSource.getConnection(); Scanner scanner = new Scanner(System.in); String name = scanner.next(); int age = scanner.nextInt(); String sql = "insert into student values(?,?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,name); preparedStatement.setInt(2,age); int n = preparedStatement.executeUpdate(); System.out.println(n); preparedStatement.close(); connection.close(); }
2.5 執(zhí)行 SQL 語(yǔ)句
執(zhí)行 SQL 語(yǔ)句,把剛才解析好的語(yǔ)句發(fā)給數(shù)據(jù)庫(kù)服務(wù)器??梢酝ㄟ^(guò) preparedStatement 對(duì)象的兩個(gè)方法將 SQL 語(yǔ)句發(fā)送給服務(wù)器:
1)executeUpdate():insert 、update 、delete 操作統(tǒng)一都是用 executeUpdate() 方法發(fā)送請(qǐng)求給服務(wù)器。執(zhí)行這個(gè)方法,就會(huì)在內(nèi)部,給數(shù)據(jù)庫(kù)服務(wù)器發(fā)起請(qǐng)求,請(qǐng)求中就是包含了解析后的 sql ,等待數(shù)據(jù)庫(kù)執(zhí)行 sql ,返回響應(yīng),獲取到返回值。這個(gè)返回值試一個(gè) int 類型,表示這個(gè)操作影響了多少行數(shù)據(jù)。
代碼如下:
//4.0 發(fā)送已經(jīng)解析好的sql語(yǔ)句到數(shù)據(jù)庫(kù)服務(wù)器中 int n = preparedStatement.executeUpdate(); System.out.println(n);
2)executeQuery():針對(duì) select 操作使用的方法,將解析后的 sql 發(fā)送給服務(wù)器,返回響應(yīng)是一個(gè)結(jié)果集合。
遍歷結(jié)果集合:通過(guò) resultSet.next() 作為判斷是否為空條件,通過(guò) resultSet.getInt("列名")來(lái)獲取整型數(shù)據(jù),比如 resultSet.getString("列名") 獲取字符串等等類型的數(shù)據(jù)。
代碼如下:
//得到的是一個(gè)結(jié)果集 ResultSet resultSet = preparedStatement1.executeQuery(); while(resultSet.next()){ String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println(age + " " + name ); }
2.6 釋放資源
在完成數(shù)據(jù)庫(kù)操作后,及時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接以釋放資源。以上需要釋放的資源有:preparedStatement、connection 。
代碼如下:
preparedStatement.close(); connection.close();
3.0 完整代碼
import com.mysql.cj.jdbc.MysqlDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class demo { public static void main(String[] args) throws SQLException { //1.0 創(chuàng)建數(shù)據(jù)源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("123456"); //2.0 與數(shù)據(jù)庫(kù)建立聯(lián)系 Connection connection = dataSource.getConnection(); // 3.0 創(chuàng)建SQL語(yǔ)句 String sql = "insert into student values('張三三',14)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); String sql1 = "select * from student"; PreparedStatement preparedStatement1 = connection.prepareStatement(sql1); //4.0 發(fā)送已經(jīng)解析好的sql語(yǔ)句到數(shù)據(jù)庫(kù)服務(wù)器中 int n = preparedStatement.executeUpdate(); System.out.println(n); //得到的是一個(gè)結(jié)果集 ResultSet resultSet = preparedStatement1.executeQuery(); while(resultSet.next()){ String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println(age + " " + name ); } //5.0 釋放資源 preparedStatement.close(); connection.close(); } }
到此這篇關(guān)于Java連接MySQL數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)交互的示例的文章就介紹到這了,更多相關(guān)Java連接MySQL交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問(wèn)題
這篇文章主要介紹了IDEA2020 Plugins不能用的解決辦法,文中給大家介紹了Intellij IDEA 2020.1 的Plugins 搜索不了插件,連接超時(shí)的問(wèn)題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-06-06Spring Boot整合消息隊(duì)列RabbitMQ的實(shí)現(xiàn)示例
本文主要介紹了Spring Boot整合消息隊(duì)列RabbitMQ的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03Spring Cloud Gateway層限流實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Spring Cloud Gateway層限流實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Spring項(xiàng)目接入DeepSeek的兩種超簡(jiǎn)單的方式分享
DeepSeek?作為一款卓越的國(guó)產(chǎn)?AI?模型,越來(lái)越多的公司考慮在自己的應(yīng)用中集成,本文為大家?分享了Spring項(xiàng)目接入DeepSeek的兩種超簡(jiǎn)單的方式,希望對(duì)大家有所幫助2025-02-02JAVA實(shí)現(xiàn)DOC轉(zhuǎn)PDF的示例代碼
Word作為目前主流的文本編輯軟件之一,功能十分強(qiáng)大,但是在傳輸?shù)臅r(shí)候不穩(wěn)定,那么如何從DOC轉(zhuǎn)PDF,本文就來(lái)介紹一下,感興趣的可以了解一下2021-08-08