MySQL數據庫 JDBC 編程(Java 連接 MySQL)

1. 數據庫編程的基礎條件

如果你想實現代碼操作數據庫,那麼以下條件是你實現它的前提

編程語言:

例如 Java、C++、Python 等等,這些語言都能夠實現操作數據庫

某個數據庫的操作:

例如我在前面章節就介紹瞭關於 MySQL 的操作,實現其它數據庫如 Oracle、SQL Server 等等也要學會對應數據庫的一些操作

安裝數據庫驅動包:

不同的數據庫對應不同的編程語言提供瞭不同的數據庫驅動包,這些驅動包內實現瞭操作對應數據庫的 API

2. Java 的數據庫編程:JDBC

由於不同數據庫的廠商實現數據庫的 API 其實是不太一樣的,因此很多語言就把這些數據庫的 API 進行再一次的封裝,封裝出瞭一套統一的 API。這樣就可以通過一套代碼來操作多個不同的數據庫瞭

在 Java 中,這樣的封裝就是由 Java 標準庫來完成的,封裝出瞭一套統一的數據庫 API 稱為 JDBC

拓展:

Java 本身是跨平臺語言,雖然不同操作系統提供瞭不同的 API,但是 Java 本身也把這些 API 封裝瞭起來,在標準庫中提供瞭統一的接口,因此 Java 就可以一次編譯,到處運行

JDBC 介紹:

  • JDBC,即 Java Database Connectivity,是指 Java 數據庫連接。是一種用於執行 SQL 語句的 Java API,它是 Java 中的數據庫連接規范。
  • 這個 API 由 java.sql javax.sql 包中的一些類和接口組成,它為 Java 開發人員操作數據庫提供瞭一個標準的 API,可以為多種關系數據庫提供統一訪問

註意:

  • JDBC API 是 Java 標準庫自帶的,可以直接用,但是 MySQL 的 JDBC 驅動不是系統自帶的,因此需要額外進行下載安裝
  • MySQL 的 JDBC 驅動其實就是對 JDBC API 裡面一些類和接口的具體實現

3. JDBC 訪問數據庫的層次結構

在這裡插入圖片描述

4. MySQL 數據庫操作介紹

在前面章節我就介紹瞭關於 MySQL 的一些知識瞭,如果你在這方面有漏洞的話,可以直接通過下面的文章來進行補充。

第一章鏈接: 【MySQL 數據庫】數據庫的基礎知識

第二章鏈接: 【MySQL 數據庫】MySQL 的對庫的操作及其數據類型

第三章鏈接: 【MySQL 數據庫】數據表的基本操作

第四章鏈接: 【MySQL 數據庫】數據庫的約束及數據表的設計原理

第五章鏈接: 【MySQL 數據庫】聚合查詢和聯合查詢操作

第六章鏈接: 【MySQL 數據庫】MySQL 的索引和事務

5. MySQL 驅動包的下載及添加到項目

由於 MySQL 的 JDBC 驅動不是系統自帶的,因此需要額外進行下載安裝

各大數據庫的官網就有對應數據庫的 JDBC 驅動,但這裡我推薦使用一些中央倉庫來進行下載,例如 mvnrepository

驅動包下載步驟:

進入 mvnrepository 網站,在搜索欄搜索 MySQL,就可以查詢到以下結果

在這裡插入圖片描述

選擇第一個 MySQL Connector/J,就可以跳轉到下載版本選擇的頁面

在這裡插入圖片描述

選擇好自己對應的數據庫版本的驅動(大版本一定要對應,小版本區別不大可以隨意選),由於我自己是 5.x 系列的MySQL,因此,我選擇大版號是5的就行。選擇後就跳到瞭最終下載的頁面

在這裡插入圖片描述

點擊 jar 就開始下載瞭(這個 jar 包就是將這個驅動包中的一些 .class 文件以壓縮包的形式進行打包瞭)

下載完成後,這個驅動包就已經下載到你本地瞭,隻再將它引入到你的項目就可以是用瞭

驅動包添加到項目步驟(以下介紹一種方法):

  • 首先用自己的編譯器創建一個項目(我個人用的 IDEA,但是其它編譯器方式也一樣)
  • 在你的項目裡面新建一個目錄,目錄名隨意(我個人起的是 lib)

在這裡插入圖片描述

  • 將下載的驅動包添加到這個目錄中,直接 CV 就行,添加成功後就會出現

在這裡插入圖片描述

讓我們新建的這個添加瞭驅動包的目錄成為一個庫(IDEA 中右鍵該目錄,選擇 add as Library… 就可以)

在這裡插入圖片描述

將這個庫加好之後,就可以使用驅動包中的類和方法瞭,此時就可以進行數據庫編程瞭

6. JDBC 使用步驟

6.1 創建數據庫源,連接 Connection

創建一個數據庫源:

DataSource dataSource=new MysqlDataSource();
// DataSource 是來自於 Java 標準庫的一個接口,它用來表示“數據庫在哪”
// MysqlDataSource 是來自於 MySQL 的驅動包,它是實現瞭 DataSource 接口的類

數據庫就是一個服務器程序,可以通過 DataSource 來描述服務器的 地址、端口、用戶名、密碼、要訪問的數據庫名等

把數據庫的位置信息,設置到 DataSource

// 1)通過一個 URL 來表示連接的數據庫、數據庫的 ip、端口、數據庫名、編碼方式、是否加密
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false");
// 2)設置登錄數據庫的用戶名
((MysqlDataSource)dataSource).setUser("root");
// 3)設置登錄數據庫的密碼
((MysqlDataSource)dataSource).setPassword("1234");

由於 setURLsetUsersetPassword 都是 MysqlDataSource 實現的,所以使用時需要向下轉型
上述 URL 是一種固定的寫法,例如:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&setSSL=false

  • jdbc 表示使用 JDBC 訪問數據庫
  • mysql 表示訪問的數據庫是 MySQL
  • 172.0.0.1 是 IP 地址,IP 地址是用來區分是哪個主機,172.0.0.1 這個 IP 地址表示當前使用的主機自身,因為我的 MySQL 服務器也裝在自己電腦上,自行修改
  • 3306 是端口號,這是安裝數據庫服務器時手動設置的,一般默認是3306,它是用來區分主機上的某個程序
  • test 是要訪問的數據庫名,這是我數據庫裡面的,自行修改
  • characterEncoding=utf8 是用來指定編碼方式的,此處是使用 utf8,需要和使用的數據庫便方式對應,自行修改
  • useSSL=false 是用來表示是否加密的,此處表示不加密,自行修改

連接數據庫,進行真正的網絡通信:

Connection connection=dataSource.getConnection();


Connection 是 Java 標準庫裡的,雖然 MySQL 驅動裡面也有。它是用來進行和數據庫服務器進行網絡連接的
getConnection 用於獲得試圖建立到指定數據庫 URL 的連接,如果連接成功就返回一個 Connection 對象,如果失敗就拋出異常
由於 getConnection 可能會連接失敗(例如 IP 地址、端口等輸入錯誤),因此就需要在方法聲明時通過 throws 給上層調用者拋出異常或者使用 try-catch 去處理異常

6.2 構造 SQL 語句,為執行的操作做準備

通過字符串,構造一個要執行的 sql

// 例如要執行新增元素操作(表名為 student,有兩列 id 和 student
Scanner scanner=new Scanner(System.in);
System.out.print("請輸入 id:");
int id=scanner.nextInt();
System.out.print("請輸入 姓名:");
String name=scanner.next();
String sql="insert into student values(?,?)";

  1. sql 就是構造的 SQL 語句,裡面就是要執行的具體操作
  2. sql 語句中可以不用加分號
  3. 表示通配符,可以通過它對 sql 語句裡的內容進行動態替換,需要替換的內容用 ?代替,後續再使用 PreparedStatement 對象的一些方法將其再替換成具體要更改的值

例如:

void setInt(int paramenterIndex, int x) :paramenterIndex 表示 sql 語句中要替換通配符的具體位置(從1開始),x 表示要替換掉具體值
void setString(int parameterIndex, String x) :paramenterIndex 表示 sql 語句中要替換通配符的具體位置(從1開始),x 表示要替換掉具體值
通過 prepareStatement(sql) 方法,將構造的字符串 sql 轉化成真正的數據庫底層的 SQL 語句

PreparedStatement statement=connection.prepareStatement(sql);
// 通過 setInt 方法,將 SQL 語句中的第一處通配符進行具體值的替換
statement.setInt(1,id);
// 通過 setString 方法,將 SQL 語句中的第二處通配符進行具體值的替換
statement.setString(2,name);

JDBC 中,使用 Connection 和數據庫建立瞭連接對象 connection,那麼 connection 就可以調用 prepareStatement(String sql) 方法對參數 sql 指定的 SQL 語句進行編譯預處理,生成該數據庫底層的內部命令,並將該命令封裝在 PreparedStatement 對象中

6.3 執行 SQL,並處理結果集

通過 PreparedStatement 對象的 executeQuery 或者 executeUpdate 方法來執行 SQL

如果是執行內容變更的操作(增加、修改、刪除),就使用 int executeUpdate() 方法

int ret=statement.executeUpdate();
// executeUpdate 的返回結果是執行該操作後影響的行數

// 可以通過打印返回值來顯示影響的行數
System.out.println("ret: "+ret);

如果要是要執行查詢操作,就使用 ResultSet executeQuery() 方法

ResultSet resultSet=statement.executeQuery();
// executeQuery 的返回結果是執行該操作後查詢到的類似於臨時表的結構,存放在 ResultSet 對象中

// 接下來我們可以對它進行遍歷,類似於迭代器的遍歷,方法如下
while(resultSet.next()){
    // 假設有兩列 id 和 name
    int id=resultSet.getInt(id);
    String name=resultSet.getString(name);
    System.out.println("id="+id+", name="+name);
}

SQL 查詢語句對數據庫的查詢操作將返回一個 ResultSet 對象,ResultSet 對象由按列(字段)組織的數據行構成
ResultSet 對象一次隻能看到一行數據,使用 next() 方法,可以移到下一個數據行(類似於 i++)
可以使用 ResultSet 對象的 getXxx() 方法,去獲得字段。常用方法後面講將介紹

6.4 釋放資源

當我們執行完瞭我們的 SQL 語句後,如果不再使用某些對象,就需要把連接關閉,釋放掉對應的資源

// 如果有 ResultSet 對象不需要使用後,需要關閉這個連接
resultSet.close();

// Connection 不需要使用後,需要關閉這個連接
connection.close();

// PreparedStatement 不需要使用後,需要關閉這個連接
statement.close();

ResultSetConnectionPreparedStatement 這些對象都對應著一些及機器的硬件資源,如果不使用的話就要及時還回去。就類似於借書,如果大傢在圖書館隻借書,不還書,那麼圖書館的書籍資源就會一直減少
這些對象可以使用 close() 方法,來關閉和客戶端與服務器建立的連接,以此釋放占用的資源

6.5 JDBC 編程模板

通過上面五步,就可以進行基礎的 Java 的 JDBC 編程瞭,雖然方法不止這一種,但如果你還不會的話,掌握這個方法就行瞭。最後再總結下整個的模板,依據它,我們就可以用 Java 語言對 MySQL 數據庫進行各種操作

public static void test(){
    // 1. 創建數據庫源,連接 Connection
 DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();

    // 2. 構造一個 SQL 語句,為要進行的操作做準備
    String sql="";
    PreparedStatement statement=connection.prepareStatement(sql);

 // 3. 執行 SQL,並處理結果集
    int ret=statement.executeUpdate();

    // 4. 執行完成,釋放資源
    statement.close();
    connection.close();
}

7. JDBC 常用接口和類

上述 JDBC 編程步驟中已經將以下接口和類介紹瞭很多,所以可以互相補充漏洞

7.1 DataSource 和 MysqlDataSource

補充:

上述代碼也可以直接使用 MysqlDataSource 來創建一個數據源,這樣就可以不用使用向下轉型瞭。但是如果使用 DataSource 的話,那麼代碼中其它代碼其實都是使用 DataSource 這個類型的,這是和具體數據庫類型無關的類,當你需要切換數據庫時,就不需要大幅度修改代碼

7.2 Connection

Connection 接口實現類由數據庫提供,獲取 Connection 對象通常有兩種方式:

方式一: 通過 DataSource(數據源)對象獲取

// 創建一個數據庫源
DataSource dataSource=new MysqlDataSource();

// 設置數據庫具體信息
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");

// 創建數據庫連接
Connection connection=dataSource.getConnection();

方式二: 通過 DriverManager(驅動管理類)的靜態方法獲取

// 加載 JDBC 驅動程序
Class.forName("com.mysql.cj.jdbc.Driver");

// 創建數據庫連接
Connection connection=DriverManager.getConnection(url);

MySQL 數據庫驅動程序被封裝在 Driver 類中,該類的包名是 com.mysql.cj.jdbc,該類不是 Java 運行環境類庫中的類

上述兩種方式的區別:

  • DriverManager 類來獲取的 Connection 連接,是無法重復利用的,每次使用完以後釋放資源時,通過 connection.close() 都是關閉物理連接
  • DataSource 提供連接池的支持。連接池在初始化時創建一定數量的數據庫連接,這些連接是可以重復利用的,每次使用完數據庫連接,通過 connection.close() 釋放資源,都是將 Connection 連接對象回收

7.3 PreparedStatement

PreparedStatement 是 JDBC API 提供的三種可以將 SQL 語句發送到數據庫的對象之一。這裡對這三種做一個簡單介紹

  • Statement: 用於執行不帶參數的簡單 SQL
  • PreparedStatement
  1. 用於執行帶或者不帶參數的 SQL 語句
  2. SQL 語句會預編譯在數據庫系統
  3. 執行速度快於 Statement 對象
  • CallableStatement: 用於執行數據庫存儲過程的調用

7.4 ResultSet

ResultSet 對象它被稱為結果集,它代表符合 SQL 語句條件的所有行,並且它通過一套 getXxx() 方法提供瞭對這些行中數據的訪問
ResultSet 裡的數據是一行一行排列的,每當有多個字段,並且有一個記錄指針,指針所指的數據行叫做當前數據行,我們隻能來操作當前的數據行。我們如果想要取得某一條記錄,就要使用 ResultSet next() 方法,可以通過結合 while 循環來遍歷 ResultSet 裡的所有記錄

常見 ResultSet 對象方法:

註意:

ResultSet 對象和數據庫連接對象 Connection 實現瞭緊密連接,一旦連接對象被關閉,ResultSet 對象中的數據就會立刻消失

8. Java 操作數據庫實例

8.1 往表中新增數據

在 student 表中新增學生 id 和 name:

public static void testInsert() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("請輸入id:");
    int id=scanner.nextInt();
    System.out.print("請輸入姓名:");
    String name=scanner.next();
    String sql="insert into student values(?,?)";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setInt(1,id);
    statement.setString(2,name);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.2 刪除表中的數據

在表名為 student 的表中,刪除學生表中符合 id 條件的記錄:

public static void testDelete() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("請輸入要刪除的 id:");
    int id=scanner.nextInt();
    String sql="delete from student where id=?";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setInt(1,id);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.3 修改表中的數據

在表名為 student 的表中,將符合 id 條件的學生姓名進行修改:

public static void testUpdate() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    Scanner scanner=new Scanner(System.in);
    System.out.print("情輸入你要更改的學生 id:");
    int id=scanner.nextInt();
    System.out.print("請輸入你要更改後的學生姓名:");
    String name=scanner.next();
    String sql="update student set name=? where id=?";
    PreparedStatement statement=connection.prepareStatement(sql);
    statement.setString(1,name);
    statement.setInt(2,id);
    int ret=statement.executeUpdate();
    System.out.println("ret: "+ret);
    statement.close();
    connection.close();
}

8.4 查找表中的數據

查找表名為 student 的表中的所有數據:

public static void testSelect() throws SQLException {
    DataSource dataSource=new MysqlDataSource();
    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("1234");
    Connection connection=dataSource.getConnection();
    String sql="select * from student";
    PreparedStatement statement=connection.prepareStatement(sql);
    ResultSet resultSet=statement.executeQuery();
    while(resultSet.next()){
        int id=resultSet.getInt("id");
        String name=resultSet.getString("name");
        System.out.println("id = "+id+", name = "+name);
    }
    resultSet.close();
    statement.close();
    connection.close();
}

到此這篇關於MySQL數據庫 JDBC 編程(Java 連接 MySQL)的文章就介紹到這瞭,更多相關Java 連接 MySQL內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: