前幾天我們已經完成了 HTML、Servlet、JSP,也在 MySQL 建立了 medical_system 資料庫。
但是目前還有一個問題:
Java 到底要怎麼跟 MySQL 溝通?
今天就來認識 JDBC。
⸻
一、JDBC 是什麼?
JDBC 全名是:
Java Database Connectivity
簡單來說,它就是讓 Java 程式可以跟資料庫溝通的一套 API。
我們可以把它想成一座橋:
Java 程式
↓
JDBC
↓
MySQL Connector/J
↓
MySQL
其中 MySQL Connector/J 是 MySQL 提供給 Java 使用的 JDBC Driver,可以讓 Java 程式連接 MySQL。(MySQL Developer Zone)
所以我們今天的目標就是:
Java
↓
JDBC
↓
MySQL
↓
medical_system
⸻
二、先加入 MySQL Connector/J
因為我們使用 Maven,所以不用自己下載 .jar 檔案。
在 pom.xml 裡加入 MySQL Connector/J dependency。
MySQL 官方文件也提供了透過 Maven 安裝 Connector/J 的方式,主要就是使用 com.mysql:mysql-connector-j。(MySQL Developer Zone)
加入之後,讓 Maven 重新載入 dependency。
如果 IntelliJ 沒有馬上抓到,可以點選 Maven 的 Reload。
⸻
三、建立資料庫連線類別
接著在 Java 專案裡建立:
src
└── main
└── java
└── util
└── DBConnection.java
先寫最基本的連線程式:
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private static final String URL =
"jdbc:mysql://localhost:3306/medical_system?useSSL=false&serverTimezone=Asia/Taipei";
private static final String USER = "root";
private static final String PASSWORD = "你的MySQL密碼";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
這裡最重要的是:
DriverManager.getConnection(...)
它會根據我們提供的資料庫 URL、帳號和密碼建立連線。
⸻
四、看懂 JDBC URL
這一行可能一開始看起來有點複雜:
jdbc:mysql://localhost:3306/medical_system
其實可以拆成:
jdbc:mysql://localhost:3306/medical_system
│ │ │ │
│ │ │ └── 資料庫名稱
│ │ └──────────── MySQL 預設 Port
│ └──────────────────── MySQL
└───────────────────────── JDBC
所以:
localhost
代表 MySQL 是跑在自己的電腦上。
3306
是 MySQL 常見的連線 Port。
medical_system
就是我們昨天建立的資料庫。
⸻
五、測試 Java 能不能連上 MySQL
我們可以另外建立一個測試類別:
import java.sql.Connection;
public class TestDB {
public static void main(String[] args) {
try (Connection conn = DBConnection.getConnection()) {
System.out.println("MySQL 連線成功!");
} catch (Exception e) {
System.out.println("MySQL 連線失敗!");
e.printStackTrace();
}
}
}
如果成功,Console 應該會看到:
MySQL 連線成功!
🎉
這代表:
Java
↓
JDBC
↓
MySQL Connector/J
↓
MySQL
↓
medical_system
已經成功連起來了。
⸻
六、為什麼要使用 try-with-resources?
你可能會注意到我這次沒有寫:
Connection conn = null;
然後最後再:
conn.close();
而是使用:
try (Connection conn = DBConnection.getConnection()) {
}
這叫做 try-with-resources。
它的好處是,當程式離開 try 區塊時,Java 會自動幫我們關閉資源。JDBC 的 Connection、Statement、ResultSet 都可以使用這種方式管理。(Oracle Docs)
所以我們可以養成一個習慣:
try (Connection conn = DBConnection.getConnection()) {
// 資料庫操作
}
而不是每次都自己記得:
conn.close();
⸻
七、帳號密碼不要直接公開
這裡有一個很重要的觀念。
我在範例裡寫:
private static final String PASSWORD = "你的MySQL密碼";
只是為了讓程式容易理解。
實際開發時,不建議把真正的資料庫密碼直接寫進 GitHub 或公開專案。
例如:
PASSWORD = "123456";
這種寫法非常不安全。
醫療資訊系統又會涉及病患資料,所以之後我們會再討論如何把:
從程式碼中分離出去。
⸻
八、今天先做到哪裡?
今天我們先不要急著查詢病患資料。
目前完成的是:
MySQL
↓
建立 medical_system
↓
建立 patient table
↓
Java 加入 Connector/J
↓
建立 DBConnection
↓
Java 成功連上 MySQL
下一步才是:
Java
↓
JDBC
↓
SQL
↓
patient table
↓
取得病患資料
這就是我們接下來要做的事情。
⸻
今日小結
今天第一次讓 Java 成功連接 MySQL。
我學到:
到這裡,我們的系統已經從單純的網頁,開始真正碰到「資料庫」了。
Day 16 完成!
下一篇就要正式讓 Java 從 patient 資料表把病患資料查出來。這會是我們第一次真正執行 SQL 查詢。