首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JDBC 實現 MySQL 多表關聯查詢:JOIN 與子查詢的效能比較

     編輯:Java 綜合教學

JDBC 實現 MySQL 多表關聯查詢:JOIN 與子查詢的效能比較

在 Java 應用開發中,資料庫多表關聯查詢是常見需求。本文透過 JDBC 連接 MySQL,示範如何使用 JOIN 與子查詢兩種方式實現關聯查詢,並分析其效能差異。

環境準備

範例使用 MySQL 資料庫,包含兩張表:info(人員基本資料)與 nation(民族資料)。info 表透過 Nation 欄位關聯 nation 表的 Code 欄位。

方式一:使用 JOIN 關聯查詢

最直接的方式是在 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,並確保關聯欄位有索引。
  • 避免在迴圈中建立資料庫連線,善用連線池(如 HikariCP、Druid)。
  • 若需極致效能,可考慮將關聯資料冗餘存儲,或使用 Redis 緩存民族字典。
  • 使用 PreparedStatement 防止 SQL 注入,提升執行計劃重用率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved