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