在 Java 應用開發中,資料庫多表關聯查詢是常見需求。本文透過 JDBC 連接 MySQL,示範如何使用 JOIN 與子查詢兩種方式實現關聯查詢,並分析其效能差異。
範例使用 MySQL 資料庫,包含兩張表:info(人員基本資料)與 nation(民族資料)。info 表透過 Nation 欄位關聯 nation 表的 Code 欄位。
最直接的方式是在 SQL 中使用 JOIN ... ON 子句,一次查詢即可取得所需欄位:
String sql = "SELECT info.Code, info.Name, info.Sex, nation.Name AS nation_name, info.Birthday " +
"FROM info JOIN nation ON info.Nation = nation.Code";
此方式優點是 SQL 直觀、資料庫優化器可發揮作用;缺點是當資料量極大、索引不當時可能效能下降。
另一種思路是先查主表,再在 Java 代碼中針對每一筆記錄查詢關聯表:
// 主查詢
String sql = "SELECT * FROM info";
Statement state = conn.createStatement();
ResultSet rs = state.executeQuery(sql);
while (rs.next()) {
String nationCode = rs.getString(4);
String nationName = getNationName(nationCode); // 另開連線查詢 nation 表
// 輸出處理...
}
// 子查詢方法
private static String getNationName(String code) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "");
Statement sta = conn.createStatement();
String sql = "SELECT Name FROM nation WHERE Code = '" + code + "'";
ResultSet rs = sta.executeQuery(sql);
String name = "";
if (rs.next()) name = rs.getString(1);
conn.close();
return name;
}
此方式會導致 N+1 問題:若主表有 1000 筆資料,需額外建立 1000 次資料庫連線與查詢,效能極差,不建議生產環境使用。
public static String formatDate(Date d) {
SimpleDateFormat f = new SimpleDateFormat("yyyy年MM月dd日");
return f.format(d);
}

JOIN,並確保關聯欄位有索引。PreparedStatement 防止 SQL 注入,提升執行計劃重用率。