驅動程式演進
| 世代 | 套件名稱 | 驅動類別 | 狀態 |
| 第一代 (舊) | Microsoft JDBC Driver 2000/2005 | com.microsoft.jdbc.sqlserver.SQLServerDriver | 已停止維護 |
| 第二代 | SQL Server 2005 JDBC Driver 1.x | com.microsoft.sqlserver.jdbc.SQLServerDriver | 舊版相容 |
| 現代 (推薦) | Microsoft JDBC Driver for SQL Server (mssql-jdbc) | com.microsoft.sqlserver.jdbc.SQLServerDriver | 持續更新、支援 JDBC 4.3+、Azure AD、Always Encrypted |
Maven/Gradle 相依性
<!-- Maven -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.6.3.jre11</version> <!-- 依 JDK 版本選擇 jre8/jre11/jre17 -->
</dependency>
// Gradle
implementation "com.microsoft.sqlserver:mssql-jdbc:12.6.3.jre11"
連線字串格式
// 標準格式
jdbc:sqlserver://:;databaseName=;encrypt=true;trustServerCertificate=false;
// 常用參數
jdbc:sqlserver://192.168.1.100:1433;databaseName=MyDB;
encrypt=true;trustServerCertificate=false;
loginTimeout=30;socketTimeout=60;
applicationName=MyApp;integratedSecurity=false;
關鍵參數: `encrypt=true` 強制 TLS(生產必開),`trustServerCertificate=false` 驗證伺服器憑證(需有效 CA 簽署)。開發環境可暫設 `trustServerCertificate=true`。
完整 Java 連線範例
import java.sql.*;
public class SqlServerJdbcDemo {
public static void main(String[] args) {
String url = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=true;trustServerCertificate=true;";
String user = "app_user";
String password = "StrongP@ssw0rd!";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("Connected: " + conn.getMetaData().getDatabaseProductVersion());
// 參數化查詢
String sql = "SELECT TOP 10 name, create_date FROM sys.tables WHERE type = 'U'";
try (PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.printf("Table: %-30s Created: %s%n", rs.getString(1), rs.getTimestamp(2));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
進階功能支援
- 資料表值參數 (TVP): `Structured` 型別傳遞集合給預存程序,效能優於 XML/字串拆解。
- Always Encrypted: 用戶端驅動程式透明加密/解密敏感欄位,金鑰存於 Azure Key Vault / Windows 憑證存儲。
- Azure Active Directory 驗證: `authentication=ActiveDirectoryPassword` / `ActiveDirectoryIntegrated` / `ActiveDirectoryServicePrincipal` / `ActiveDirectoryManagedIdentity`。
- 連線池整合: 搭配 HikariCP (`dataSourceClassName=com.microsoft.sqlserver.jdbc.SQLServerDataSource`)。
常見問題排查
| 錯誤 | 原因 | 解決 |
| The driver could not establish a secure connection | TLS 版本不符 / 憑證不信任 | JDK 升級至 8u161+;檢查伺服器憑證鏈;開發環境暫用 trustServerCertificate=true |
| Login failed for user | 帳號/密碼錯誤、未授權資料庫、SQL 驗證未啟用 | SSMS 確認登入、對應使用者、伺服器驗證模式 |
| Connection reset | 防火牆、SQL Server 未啟用 TCP/IP、埠號錯誤 | SQL Server Configuration Manager 啟用 TCP/IP、確認 1433/動態埠 |