sqljdbc4.jar 或 mssql-jdbc-.jar sqljdbc4.jar(JDK 6/7/8)或 mssql-jdbc-12.x.jre11.jar(JDK 11+)。com.microsoft.sqlserver:mssql-jdbc:12.4.1.jre11implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.1.jre11'lib/ 目錄 → Build Path → Add JARs1433(預設)-- 使用 SSMS 以 Windows 驗證登入,執行:
ALTER LOGIN sa ENABLE;
ALTER LOGIN sa WITH PASSWORD = 'YourStrongPassword123';
-- 或建立新登入
CREATE LOGIN dev_user WITH PASSWORD = 'DevPass123';
GRANT CONNECT SQL TO dev_user;
-- 指定資料庫權限
USE YourDatabase;
CREATE USER dev_user FOR LOGIN dev_user;
EXEC sp_addrolemember 'db_owner', 'dev_user';
// 基本格式(SQL Server 2005+)
jdbc:sqlserver://localhost:1433;databaseName=YourDatabase;encrypt=true;trustServerCertificate=true
// 命名實例
jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS;databaseName=YourDB
// 整合驗證(Windows 域環境)
jdbc:sqlserver://localhost:1433;databaseName=YourDB;integratedSecurity=true
參數說明:
encrypt=true:強制 TLS 加密(Azure SQL 必須)。trustServerCertificate=true:開發環境信任自簽憑證,生產請設 false 並配置 CA。loginTimeout、socketTimeout:建議顯式設定(秒)。package com.example.jdbc;
import java.sql.*;
public class SqlServerJdbcTest {
public static void main(String[] args) {
String url = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=true;trustServerCertificate=true";
String user = "dev_user";
String password = "DevPass123";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("✅ 連線成功!");
// 測試查詢
String sql = "SELECT TOP 5 name, create_date FROM sys.tables";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.printf("Table: %-30s Created: %s%n",
rs.getString("name"), rs.getTimestamp("create_date"));
}
}
// 測試更新
String dml = "INSERT INTO demo_log (msg) VALUES (?)";
try (PreparedStatement ps = conn.prepareStatement(dml, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, "JDBC test " + System.currentTimeMillis());
int rows = ps.executeUpdate();
System.out.println("插入行數: " + rows);
try (ResultSet keys = ps.getGeneratedKeys()) {
if (keys.next()) System.out.println("自增 ID: " + keys.getLong(1));
}
}
} catch (SQLException e) {
System.err.println("❌ 連線失敗: " + e.getMessage());
e.printStackTrace();
}
}
}
| 錯誤 | 原因 | 解決 |
|---|---|---|
No suitable driver | JAR 未在 classpath / 版本不匹配 JDK | 確認 Maven 依賴或 Build Path 包含正確 JAR |
Connection refused | TCP/IP 未啟用 / 防火牆阻擋 / 埠號錯誤 | Configuration Manager 啟用 TCP/IP、開放 1433 埠 |
Login failed for user | 帳號密碼錯 / SQL 驗證模式未啟用 / 帳號鎖定 | SSMS 檢查 Server Properties → Security → SQL Server and Windows Authentication mode |
The driver could not establish a secure connection | TLS 版本不支援 / 憑證問題 | 加 trustServerCertificate=true 或更新 JDK / 驅動版本 |
ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver | 驅動類名錯誤(舊版 com.microsoft.jdbc.sqlserver.SQLServerDriver) | JDBC 4.0+ 統一用 com.microsoft.sqlserver.jdbc.SQLServerDriver |
maximumPoolSize、connectionTimeout、idleTimeout。encrypt=true、配置有效憑證、關閉 trustServerCertificate。applicationName 連線屬性,方便 DBA 追蹤。try-with-resources 確保資源釋放。SELECT *,明確列出欄位。