透過 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 Bridge | Java 內建,無需額外驅動 | **Java 8 已移除**,僅適合舊版環境維護 |
| 系統 DSN | 需在伺服器端 ODBC 管理員建立 | 部署麻煩,不支援跨平台 |
| Applet 沙箱限制 | 未簽署 Applet 無法建立網路連線 | **必須簽署 JAR** 並獲用戶授權 |
| 連線管理 | 範例在 init() 建立連線 | 生產環境應使用連線池、重試機制、閒置關閉 |
| SQL Injection | 原始碼字串拼接 | **必須使用 PreparedStatement** 參數化查詢 |
| 執行緒安全 | JDBC 操作阻塞 UI | 範例已改用背景執行緒 + SwingUtilities.invokeLater |
// 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");
jarsigner -keystore mykeystore applet.jar myalias 簽署deploymentruleSet.jar) 降低安全性提示