一、從建立資料庫,到真正讀取資料
前幾天,我們已經建立了 medical_system 資料庫,也透過 JDBC 讓 Java 和 MySQL 建立連線。
但是,光是連線成功還不夠。
如果要讓醫療資訊系統顯示病患資料,我們還需要讓 Java 執行 SQL,從資料庫中取得需要的內容。
今天的目標就是:使用 Java 查詢 MySQL 裡的病患資料。
二、先確認資料表裡有資料
還記得之前建立的 patient 資料表嗎?
USE medical_system;
SELECT * FROM patient;
如果之前有新增測試資料,就能看到病患的編號、姓名、性別、生日和電話。
如果資料表是空的,可以先新增一筆測試資料:
INSERT INTO patient (name, gender, birthday, phone)
VALUES ('測試病患', '男', '2006-01-21', '0912345678');
這些都是虛構的測試資料,實作時不要使用真實病患的個人資訊。
三、認識 JDBC 查詢需要的工具
Java 查詢資料時,會用到幾個常見的物件:
它們的關係可以理解成:
Java
↓
Connection
↓
PreparedStatement
↓
執行 SELECT
↓
ResultSet
↓
讀取病患資料
四、建立查詢程式
沿用 Day 16 建立的 DBConnection.java,我們另外建立一個 TestPatientQuery.java。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import util.DBConnection;
public class TestPatientQuery {
public static void main(String[] args) {
String sql = "SELECT id, name, gender, birthday, phone "
+ "FROM patient";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()
) {
while (rs.next()) {
System.out.println("編號:" + rs.getInt("id"));
System.out.println("姓名:" + rs.getString("name"));
System.out.println("性別:" + rs.getString("gender"));
System.out.println("生日:" + rs.getDate("birthday"));
System.out.println("電話:" + rs.getString("phone"));
System.out.println("--------------------");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
記得將 util.DBConnection 改成自己專案裡實際使用的套件名稱。
五、看懂這段程式
String sql = "SELECT id, name, gender, birthday, phone FROM patient";
這段 SQL 代表從 patient 資料表取得指定欄位。
如果只想取得病患姓名,也可以寫:
SELECT name FROM patient;
實際開發時,指定需要的欄位通常比一律使用 SELECT * 更容易維護。
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
executeQuery() 用於執行會回傳查詢結果的 SQL,例如 SELECT。
while (rs.next()) {
System.out.println(rs.getString("name"));
}
rs.next() 會移動到下一筆查詢結果。
只要還有資料,它就會回傳 true;沒有下一筆資料時,就會回傳 false。
因此,如果資料表有三筆病患資料,這段迴圈就會依序讀取三筆。
六、為什麼使用 PreparedStatement?
即使目前的 SQL 沒有輸入參數,我們仍然可以先使用 PreparedStatement,為後續的查詢條件做準備。
例如,未來如果要查詢特定病患,就可以使用:
String sql = "SELECT * FROM patient WHERE id = ?";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setInt(1, 1);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
}
}
其中的 ? 是參數位置,ps.setInt(1, 1) 代表將第一個參數設定為整數 1。
這種寫法可以正確處理輸入值,也有助於防止 SQL Injection。查詢使用者輸入的資料時,應優先使用參數化 SQL,而不是直接把輸入內容串進 SQL 字串。
七、如果查不到資料怎麼辦?
如果程式沒有印出任何病患資料,不一定代表程式出錯。
可能的原因包括:
可以先回到 MySQL 執行:
SELECT * FROM patient;
確認資料是否存在,再檢查 Java 的連線設定。
今日小結
今天我們完成了 Java 與 MySQL 的第一次資料查詢,學會使用 PreparedStatement 執行 SQL,再透過 ResultSet 逐筆讀取資料。
目前資料仍然只會顯示在 Console,還沒有出現在網頁上。
Day 17 完成!
下一篇,我們要反過來操作:不只讀取資料,而是讓 Java 將新的病患資料寫進 MySQL。
參考資料:MySQL Connector/J 官方文件