核心概念:JDBC vs. JDBC Driver
要区分两个概念:

- JDBC (Java Database Connectivity): 这是 Java 提供的一套标准 API(位于
java.sql和javax.sql包中),它定义了 Java 程序如何与数据库进行交互的规则,比如如何建立连接、执行 SQL 语句、处理结果集等,JDBC 本身只是一种规范,不是实现。 - JDBC Driver: 这是数据库厂商(如 Microsoft)根据 JDBC 规范提供的一套具体实现类库,当你的 Java 代码调用 JDBC API 时,实际上是调用了驱动库中的方法,由驱动库来与具体的数据库(如 SQL Server)进行底层通信。
简单比喻:
- JDBC API 就像是汽车的“操作手册”(定义了方向盘、油门、刹车等)。
- JDBC Driver 就像是汽车的“发动机和传动系统”(手册只是告诉你怎么操作,但真正让你跑起来的是它)。
Microsoft 提供的官方驱动:Microsoft JDBC Driver
对于 SQL Server,Microsoft 官方提供了 JDBC Driver,这是最推荐使用的驱动,它稳定、性能好,并且由 Microsoft 官方持续更新和维护。
1 驱动版本和分类
Microsoft JDBC Driver 主要分为两个主要版本系列,它们基于不同的 Java 版本:
| 驱动版本系列 | 最低 Java 版本 | 特点 | 适用场景 |
|---|---|---|---|
| Microsoft JDBC Driver 6.4, 6.2, 4.2 | Java 8 | 这是基于 Java 8 的传统驱动,功能成熟稳定。 | 维护旧项目或必须运行在 Java 8 环境的应用。 |
| Microsoft JDBC Driver 11.x | Java 11 | 这是当前主流和推荐的版本,它基于 Java 11,支持最新的 SQL Server 功能(如 Always Encrypted v2、列存储索引等),并提供了更好的性能和安全性。 | 所有新项目,特别是使用 Java 11 或更高版本的项目。 |
重要提示:Microsoft 已经宣布不再为 6.x 系列的驱动添加新功能,建议所有新项目都使用 JDBC Driver 11.x。
(图片来源网络,侵删)
2 驱动下载
你可以从 Microsoft 官方网站下载驱动: https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
下载页面会提供不同版本的 JAR 文件,你可以根据你的 Java 版本和需求选择,下载 mssql-jdbc-11.2.0.jre11.jar。
如何使用 JDBC Driver
使用 JDBC Driver 连接 SQL Server 数据库通常遵循以下五个标准步骤:
步骤 1:添加驱动依赖
在你的项目中,需要将下载的 JDBC Driver JAR 文件添加到类路径 中。

对于 Maven 项目(推荐):
在你的 pom.xml 文件中添加 mssql-jdbc 依赖,Maven 会自动管理下载。
<!-- 使用最新的 JDBC Driver 11.x (需要 Java 11+) -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>11.2.0.jre11</version>
</dependency>
<!-- 如果你的项目使用 Java 8,请使用 6.x 或 4.2 版本 -->
<!-- <dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.4.0.jdk8</version>
</dependency> -->
对于 Gradle 项目:
在你的 build.gradle 文件中添加:
// 使用最新的 JDBC Driver 11.x (需要 Java 11+) implementation 'com.microsoft.sqlserver:mssql-jdbc:11.2.0.jre11' // 如果你的项目使用 Java 8 // implementation 'com.microsoft.sqlserver:mssql-jdbc:6.4.0.jdk8'
手动管理 JAR:
如果你不使用构建工具,只需将下载的 .jar 文件复制到你的项目的 lib 目录下,并确保在 IDE(如 IntelliJ IDEA 或 Eclipse)中将其添加到模块的依赖中。
步骤 2:加载 JDBC 驱动
这一步是告诉 Java 虚拟机要使用哪个驱动,现代 JDBC 驱动(包括 Microsoft 的)通常通过 Service Provider Mechanism 自动注册,所以显式调用 Class.forName() 在很多情况下已经不是必须的了,但为了代码的健壮性和兼容性,加上它仍然是一个好习惯。
// 加载驱动类 (对于 Microsoft JDBC Driver 11.x, 这步通常是可选的,但建议保留)
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
步骤 3:建立数据库连接
使用 DriverManager.getConnection() 方法来获取数据库连接对象,你需要提供数据库的 URL、用户名和密码。
SQL Server 连接 URL 格式:
jdbc:sqlserver://[server_name[:port]];[databaseName=name;][property=value[;property=value]]
server_name: 数据库服务器的地址(可以是主机名、IP 地址)。port: 端口号,默认是1433。databaseName: 要连接的数据库名称。user: 用户名。password: 密码。encrypt: 是否加密连接,建议设置为true或false,对于 Azure SQL 或要求安全连接的环境,通常需要true。
示例代码:
String url = "jdbc:sqlserver://localhost:1433;databaseName=MyTestDB;encrypt=false";
String user = "sa";
String password = "your_strong_password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
if (conn != null) {
System.out.println("连接成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
最佳实践:使用
try-with-resources语句来自动关闭Connection对象,防止资源泄漏。
步骤 4:创建 Statement 并执行 SQL
获取连接后,你可以创建一个 Statement 或 PreparedStatement 对象来执行 SQL 语句。
Statement: 用于执行静态 SQL 语句。PreparedStatement: 强烈推荐用于执行带参数的 SQL,它可以防止 SQL 注入攻击,并且通常性能更好。
示例(使用 PreparedStatement 插入数据):
String sql = "INSERT INTO Employees (id, name, department) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数
pstmt.setInt(1, 101);
pstmt.setString(2, "张三");
pstmt.setString(3, "研发部");
// 执行更新
int affectedRows = pstmt.executeUpdate();
System.out.println(affectedRows + " 行数据已插入。");
} catch (SQLException e) {
e.printStackTrace();
}
步骤 5:处理结果集
对于 SELECT 查询,executeQuery() 方法会返回一个 ResultSet 对象,你可以遍历它来获取查询结果。
示例(查询数据):
String sql = "SELECT id, name, department FROM Employees";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
System.out.println("员工列表:");
while (rs.next()) { // 移动到下一行
int id = rs.getInt("id");
String name = rs.getString("name");
String dept = rs.getString("department");
System.out.println("ID: " + id + ", 姓名: " + name + ", 部门: " + dept);
}
} catch (SQLException e) {
e.printStackTrace();
}
连接字符串常用参数
| 参数 | 描述 | 示例 |
|---|---|---|
databaseName |
指定要连接的数据库。 | databaseName=MyDB |
user |
数据库用户名。 | user=myuser |
password |
数据库密码。 | password=mypassword |
encrypt |
是否使用 SSL/TLS 加密连接。 | encrypt=true (推荐) 或 encrypt=false |
trustServerCertificate |
当 encrypt=true 时,是否信任服务器提供的证书,在开发环境中可以设为 true 以避免复杂的证书配置。 |
trustServerCertificate=true |
integratedSecurity |
是否使用 Windows 集成身份验证(需要 Kerberos 支持)。 | integratedSecurity=true |
hostNameInCertificate |
指定证书中的主机名,用于验证服务器身份。 | hostNameInCertificate=your_server_name |
applicationName |
在 SQL Server 的连接和查询信息中显示的应用程序名称。 | applicationName=MyJavaApp |
示例(一个更完整的连接字符串):
jdbc:sqlserver://my-server.database.windows.net:1433;databaseName=my_db;user=myuser@my-server;password={your_password};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
最佳实践
- 使用连接池:在真实的应用中,频繁地创建和销毁连接非常消耗资源,应该使用连接池(如 HikariCP, Apache DBCP, C3P0)来管理数据库连接,HikariCP 是目前性能最好的选择之一。
- 使用
try-with-resources:确保所有Connection,Statement,ResultSet等资源都能被正确关闭,避免资源泄漏。 - 优先使用
PreparedStatement:防止 SQL 注入,提高性能。 - 处理异常:妥善处理
SQLException,记录详细的错误日志。 - 配置合理的超时:通过
loginTimeout(连接超时)和queryTimeout(查询超时)来避免应用程序长时间挂起。
希望这份详细的指南能帮助你顺利地在 Java 项目中使用 SQL Server JDBC Driver!

