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

Java 進階核心:JDBC 資料庫連線、多執行緒與 JavaBeans 元件技術

     編輯:Java 程式設計入門

前言:邁向 Java 企業級開發的關鍵技能

當你已掌握 Java 基礎語法與物件導向概念,下一步便是學習如何讓程式與外部世界互動。本章將帶你探索三項企業級開發的基石技術:JDBC 資料庫連線、多執行緒平行處理,以及JavaBeans 元件架構。透過本章學習,你將具備開發資料驅動應用、高併發程式與可重用元件的核心能力。

13.1 JDBC:Java 資料庫連線標準

為什麼需要 JDBC?

在資訊時代,資料庫是系統的心臟。市面上存在 Oracle、SQL Server、MySQL、PostgreSQL 等眾多資料庫產品,雖然都支援 SQL 標準,但各家的原生 API、連線協定、資料型別映射卻大相逕庭。若應用程式直接依賴特定資料庫的 API,將導致程式碼高度耦合,移植極其困難。

從 ODBC 到 JDBC 的演進

Microsoft 早期推出 ODBC (Open Database Connectivity),提供統一的 C 語言介面,透過驅動程式管理器屏蔽底層差異。然而 ODBC 專為 C 設計,Java 難以直接呼叫;且 ODBC 屬 Microsoft 標準,Sun 公司(現 Oracle)為了 Java 的跨平台特性,於 1996 年推出 JDBC (Java Database Connectivity)。

JDBC 繼承 ODBC 設計精髓,同樣基於 X/Open SQL CLI (Call Level Interface) 規範。為利用既有 ODBC 驅動,Sun 更提供 JDBC-ODBC Bridge(橋接器),讓 Java 可透過 ODBC 連線資料庫。

JDBC 三種連線架構

  1. Type 1:JDBC-ODBC Bridge — 客戶端載入 `jdbcodbc.dll`,轉呼叫 ODBC 驅動。適用於無原生 JDBC 驅動的資料庫(如早期 Access)。
  2. Type 2/3:中介軟體架構 — 透過 RPC 或 HTTP 協定與遠端資料庫伺服器通訊,適合 Applet/網路環境。
  3. Type 4:純 Java 原生驅動 — 直接實作資料庫網路協定(如 Oracle Thin Driver、MySQL Connector/J),效能最佳、部署最簡單,也是現代主流。

核心 API 快速上手

所有 JDBC 類別位於 java.sql 套件。核心類別包括:

  • DriverManager:驅動管理器,負責註冊驅動、建立連線
  • Connection:資料庫連線物件,代表一個 Session
  • Statement / PreparedStatement / CallableStatement:執行靜態 SQL、參數化 SQL、預存程序
  • ResultSet:查詢結果集,提供游標式資料存取
  • DatabaseMetaData / ResultSetMetaData:取得資料庫與結果集結構描述

標準連線四步驟

// 1. 載入驅動(JDBC 4.0+ 可省略,自動發現)
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 建立連線
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "user", "password");

// 3. 建立 Statement 並執行查詢
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users");

// 4. 處理結果集
while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String email = rs.getString("email");
    System.out.printf("%d | %s | %s%n", id, name, email);
}

// 5. 關閉資源(建議使用 try-with-resources 自動關閉)
rs.close(); stmt.close(); conn.close();

JDBC URL 結構解析

jdbc:<subprotocol>:<subname>

  • jdbc:協定前綴
  • subprotocol:子協定,如 mysql、postgresql、odbc
  • subname:資料源識別,可包含主機、埠號、資料庫名、屬性參數

範例:jdbc:mysql://192.168.1.100:3306/erp_db?characterEncoding=UTF-8

實戰範例:查詢學生成績資料

使用 H2 內嵌資料庫示範(無需安裝外部 DB):

import java.sql.*;

public class StudentQueryDemo {
    public static void main(String[] args) {
        String url = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
        String sql = "CREATE TABLE student (id INT PRIMARY KEY, name VARCHAR(50), age INT, chinese INT, math INT)";
        String insert = "INSERT INTO student VALUES (1, '小明', 18, 92, 85), (2, '小華', 17, 78, 90)";

        try (Connection conn = DriverManager.getConnection(url, "sa", "");
             Statement stmt = conn.createStatement()) {

            stmt.execute(sql);
            stmt.execute(insert);

            try (ResultSet rs = stmt.executeQuery("SELECT name, age, chinese, math FROM student")) {
                System.out.println("姓名  年齡  國文  數學");
                while (rs.next()) {
                    System.out.printf("%-4s  %-3d  %-3d  %-3d%n",
                        rs.getString("name"), rs.getInt("age"),
                        rs.getInt("chinese"), rs.getInt("math"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

13.2 多執行緒:讓程式同時做多件事

進程 vs 執行緒:核心觀念釐清

概念進程執行緒
定義執行中的程式實例,擁有獨立記憶體空間進程內的執行單元,共享進程資源
資源隔離完全隔離,溝通需 IPC共享堆疊、堆積、檔案描述符
建立開銷大(需配置獨立記憶體)小(輕量級進程)
切換成本高低

Java 實作多執行緒的兩條路徑

  1. 繼承 Thread 類別 — 覆寫 run() 方法。缺點:Java 單一繼承限制,若類別已繼承其他父類(如 Applet),無法使用。
  2. 實作 Runnable 介面 — 實作 run(),再傳給 Thread 建構子。推薦做法,支援多重實作、解耦任務與執行緒控制。

執行緒生命週期與狀態轉換

六大狀態:NEW → RUNNABLE → BLOCKED / WAITING / TIMED_WAITING → TERMINATED。關鍵方法:

  • start():啟動執行緒(非直接呼叫 run())
  • sleep(ms):讓出 CPU 進入 TIMED_WAITING
  • join():等待其他執行緒結束
  • yield():禮讓同優先級執行緒
  • interrupt():中斷阻塞狀態

經典範例:賽跑模擬

// 任務類別:實作 Runnable
class Racer implements Runnable {
    private final String name;
    private int position = 0;
    private static final int FINISH_LINE = 100;

    public Racer(String name) { this.name = name; }

    @Override
    public void run() {
        while (position < FINISH_LINE) {
            position++;
            System.out.printf("%s 位置: %d%n", name, position);
            try { Thread.sleep((int)(Math.random() * 50)); } 
            catch (InterruptedException e) { Thread.currentThread().interrupt(); break; }
        }
        System.out.println(name + " 衝線完成!");
    }
}

// 主程式
public class RaceDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Racer("🏃 選手 A"));
        Thread t2 = new Thread(new Racer("🏃 選手 B"));
        Thread t3 = new Thread(new Racer("🏃 選手 C"));
        t1.start(); t2.start(); t3.start();
    }
}

進階議題預告

實務開發中還需掌握:同步化、鎖機制、執行緒池、CompletableFuture 非同步程式設計、虛擬執行緒 等進階主題,建議後續深入研讀《Java Concurrency in Practice》。

13.3 JavaBeans:可重用軟體元件規範

為什麼需要元件技術?

傳統開發中,功能模組緊耦合、難以重用、升級維護成本高。元件技術將功能封裝為標準化、可獨立部署的單元(元件),像積木般組裝應用,實現「高內聚、低耦合」。

三大主流元件規範比較

規範發起者平台相關性特色
CORBAOMG 聯盟跨平台異構系統互通、IDL 介面定義語言、企業級分散式系統
COM/DCOM/ActiveXMicrosoftWindows 專屬效能優異、Visual Basic 整合度高、曾統治桌面開發
JavaBeansSun / Oracle跨平台 (Write Once, Run Anywhere)純 Java、支援序列化、Introspection 內省、屬性/事件/方法標準

JavaBeans 核心規範

一個合格的 Bean 必須遵循:

  1. 公用無參建構子 — 供工具自動實例化
  2. 實作 Serializable — 支援持久化與網路傳輸
  3. 屬性存取慣例 — getXxx()/setXxx()(Boolean 型可用 isXxx())
  4. 事件模式 — addXxxListener()/removeXxxListener(),支援觀察者模式
  5. 內省支援 — 透過 BeanInfo 或命名慣例讓建構工具發現屬性/事件/方法

簡易 Bean 範例


public class TemperatureBean implements java.io.Serializable {
    private double celsius = 0.0;
    private transient double fahrenheit; // 不序列化衍生屬性

    // 屬性存取器
    public double getCelsius() { return celsius; }
    public void setCelsius(double c) { 
        this.celsius = c; 
        this.fahrenheit = c * 9/5 + 32;
        firePropertyChange("celsius", null, c); // 通知監聽器
    }
    public double getFahrenheit() { return fahrenheit; }

    // 事件支援
    private final java.beans.PropertyChangeSupport pcs = 
        new java.beans.PropertyChangeSupport(this);
    public void addPropertyChangeListener(java.beans.PropertyChangeListener l) {
        pcs.addPropertyChangeListener(l);
    }
    public void removePropertyChangeListener(java.beans.PropertyChangeListener l) {
        pcs.removePropertyChangeListener(l);
    }
    private void firePropertyChange(String prop, Object old, Object nw) {
        pcs.firePropertyChange(prop, old, nw);
    }
}

13.4 Java 學習資源與持續精進指南

官方權威文件

  • Oracle Java Documentation — docs.oracle.com/javase/(API 規範、教學、遷移指南)
  • OpenJDK 專案 — openjdk.org(原始碼、JEP 提案、建構指南)
  • Java Language Specification (JLS) — 語言語法與語意的最終權威

高品質技術社群與媒體

必讀經典書籍

  1. 《Effective Java》第 3 版 — Joshua Bloch 著,Java 開發者的聖經
  2. 《Java Concurrency in Practice》 — Brian Goetz 著,併發編程權威指南
  3. 《深入理解 Java 虛擬機》 — 周志明 著,JVM 原理與調優實戰
  4. 《Spring 實戰》第 6 版 — Craig Walls 著,企業級框架入門首選

建立個人知識體系的建議

  1. 動手實作:每學一個概念,寫一個可執行的小專案
  2. 閱讀源碼:從集合框架、Spring 核心模組開始,學習優秀設計模式
  3. 參與開源:GitHub 搜尋 good first issue 標籤,貢獻修補文件或測試
  4. 建立部落格:用自己的話重述技術細節,倒逼深度理解
  5. 定期複盤:每季回顧技術棧,規劃下一階段學習路線

本章涵蓋 JDBC、多執行緒、JavaBeans 三大進階主題,為企業級 Java 開發奠定堅實基礎。建議讀者結合官方文件與實戰專案,逐步深化各領域專業能力。下一階段可進階學習 Spring 生態、微服務架構、雲原生部署等現代開發技術棧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
資源網址特色
Baeldungbaeldung.com實戰導向、Spring 生態深度教學、每週更新
InfoQ 中文站infoq.cn架構案例、新技術趨勢、大廠實踐分享
掘金juejin.cn中文技術社群、優質文章、小冊深度學習
Java 專欄zhuanlan.zhihu.com/java知乎 Java 專題、專家觀點、面試熱點