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

Applet 使用 JDBC-ODBC 橋接器連線 MSSQL Server 實作範例

     編輯:Java 程式設計入門

架構概述

透過 JDBC-ODBC Bridge (sun.jdbc.odbc.JdbcOdbcDriver) 連接 MSSQL Server,需在伺服器端預先建立系統 DSN (資料來源名稱)。注意:JDBC-ODBC Bridge 已於 Java 8 移除,現代專案請使用原生 JDBC 驅動程式。

完整實作程式碼

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class MSSQLApplet extends Applet implements ActionListener {
    TextField numField = new TextField(10);
    Label resultLabel = new Label("查詢結果將顯示在此");
    Button queryBtn = new Button("查詢");
    Connection conn = null;

    public void init() {
        setLayout(new FlowLayout());
        add(new Label("編號:"));
        add(numField);
        add(queryBtn);
        add(resultLabel);
        queryBtn.addActionListener(this);
        
        // 建立資料庫連線 (建議移至背景執行緒)
        connectDB();
    }

    private void connectDB() {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String url = "jdbc:odbc:javadata";  // 系統 DSN 名稱
            conn = DriverManager.getConnection(url, "sa", "");  // MSSQL 預設 sa/空密碼
            resultLabel.setText("資料庫連線成功");
        } catch (Exception e) {
            resultLabel.setText("連線失敗: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == queryBtn && conn != null) {
            String num = numField.getText().trim();
            if (num.isEmpty()) return;
            
            new Thread(() -> {
                try {
                    Statement stmt = conn.createStatement();
                    // 參數化查詢防止 SQL Injection
                    PreparedStatement ps = conn.prepareStatement(
                        "SELECT name FROM company.dbo.TB_NAME WHERE number = ?");
                    ps.setString(1, num);
                    ResultSet rs = ps.executeQuery();
                    
                    if (rs.next()) {
                        final String name = rs.getString("name");
                        // UI 更新必須在 Event Dispatch Thread
                        SwingUtilities.invokeLater(() -> 
                            resultLabel.setText("姓名: " + name));
                    } else {
                        SwingUtilities.invokeLater(() -> 
                            resultLabel.setText("查無資料"));
                    }
                    rs.close(); ps.close(); stmt.close();
                } catch (SQLException ex) {
                    SwingUtilities.invokeLater(() -> 
                        resultLabel.setText("查詢錯誤: " + ex.getMessage()));
                    ex.printStackTrace();
                }
            }).start();
        }
    }

    public void destroy() {
        try { if (conn != null) conn.close(); } catch (SQLException ignored) {}
    }
}

關鍵技術點與風險

項目說明風險/建議
JDBC-ODBC BridgeJava 內建,無需額外驅動**Java 8 已移除**,僅適合舊版環境維護
系統 DSN需在伺服器端 ODBC 管理員建立部署麻煩,不支援跨平台
Applet 沙箱限制未簽署 Applet 無法建立網路連線**必須簽署 JAR** 並獲用戶授權
連線管理範例在 init() 建立連線生產環境應使用連線池、重試機制、閒置關閉
SQL Injection原始碼字串拼接**必須使用 PreparedStatement** 參數化查詢
執行緒安全JDBC 操作阻塞 UI範例已改用背景執行緒 + SwingUtilities.invokeLater

現代替代方案:原生 JDBC 驅動

// Maven 依賴
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.2.jre11</version>
</dependency>

// 連線字串
String url = "jdbc:sqlserver://localhost:1433;databaseName=COMPANY;encrypt=true;trustServerCertificate=true";
Connection conn = DriverManager.getConnection(url, "sa", "your_password");
  • 純 Java 實作,無需 ODBC 設定,跨平台相容
  • 支援 Always Encrypted、資料分類、Azure AD 驗證等進階功能
  • 效能優於 Bridge,記憶體佔用更低

Applet 部署安全性補充

  1. 使用 jarsigner -keystore mykeystore applet.jar myalias 簽署
  2. 產生部署規則集 (deploymentruleSet.jar) 降低安全性提示
  3. 或改用 Java Web Start (JNLP) 獲得更完整權限管理
  4. **最佳方案**:將資料庫邏輯移至後端 REST API,Applet/前端僅呼叫 HTTP 介面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved