核心概念
要连接 SQL Server,Java 程序需要一个 JDBC (Java Database Connectivity) 驱动程序,这个驱动程序充当了 Java 代码和 SQL Server 数据库之间的“翻译官”,让 Java 能够发送 SQL 命令并处理返回的结果。

使用 Microsoft 官方 JDBC 驱动 (推荐)
这是最直接、最稳定的方式,由微软官方提供和维护。
步骤 1: 下载 JDBC 驱动
- 访问微软官方 JDBC 驱动下载页面: Microsoft JDBC Drivers for SQL Server
- 根据你的 Java 版本和 SQL Server 版本选择合适的驱动,对于大多数现代项目,选择 "Download" 链接下的 JAR 文件即可。
- 下载后,你会得到一个 ZIP 压缩包,
mssql-jdbc-12.4.2.jre11.jar。
步骤 2: 将驱动添加到项目中
你需要将下载的 JAR 文件添加到你的项目的类路径中。
对于 Maven 项目 (推荐):
在你的 pom.xml 文件中添加以下依赖,Maven 会自动管理依赖和版本。

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre11</version> <!-- 请使用你下载的最新版本 -->
<scope>runtime</scope>
</dependency>
对于 Gradle 项目:
在你的 build.gradle 文件中添加以下依赖。
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre11' // 请使用你下载的最新版本
对于手动项目 (如 Eclipse, IntelliJ IDEA):
- 右键点击你的项目 -> Build Path / Project Structure。
- 找到 Libraries / Dependencies 选项。
- 点击 "Add External JARs..." 或 "Add" 按钮。
- 选择你下载的
mssql-jdbc-*.jar文件。
步骤 3: 编写 Java 连接代码
这是核心部分,连接字符串是关键。

连接字符串格式:
jdbc:sqlserver://[server_name][:port];[database_name];[user];[password];[additional_properties]
server_name: SQL Server 的地址,可以是主机名、IP 地址或域名。port: SQL Server 的监听端口,默认为1433。database_name: 你要连接的数据库名称。user: 登录用户名。password: 登录密码。additional_properties: 其他可选配置,如encrypt=true,trustServerCertificate=true等。
完整代码示例
下面是一个使用 try-with-resources 语句的完整、健壮的连接示例。try-with-resources 可以确保连接、语句和结果集在使用后被自动关闭,避免资源泄漏。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlServerConnector {
// 数据库连接信息 - 建议从配置文件中读取,而不是硬编码
private static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=YourDatabaseName;encrypt=true;trustServerCertificate=true;";
private static final String USER = "your_username";
private static final String PASS = "your_password";
public static void main(String[] args) {
// 使用 try-with-resources 自动管理资源
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello, SQL Server!' AS message")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("连接成功!");
}
// 处理查询结果
while (rs.next()) {
// 假设查询返回一个名为 "message" 的列
String message = rs.getString("message");
System.out.println("查询结果: " + message);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("连接数据库失败!");
e.printStackTrace();
}
}
}
连接字符串中的重要参数 (Azure 和本地 SQL Server)
现代 SQL Server(特别是 Azure SQL)通常建议使用加密连接,以下是一些常用参数:
encrypt=true;: 强制驱动程序使用 SSL/TLS 加密与服务器之间的通信。对于 Azure SQL,这是必需的。trustServerCertificate=true;: 告诉驱动程序信任服务器提供的 SSL 证书,而不验证其是否由受信任的证书颁发机构颁发,这在开发和测试环境中非常方便,但在生产环境中不安全,应该配置正确的证书。hostNameInCertificate=your_server_name.database.windows.net;: 如果服务器名称和证书中的名称不完全匹配,使用此参数指定证书中预期的主机名。
示例 (连接到 Azure SQL):
String azureUrl = "jdbc:sqlserver://your-server-name.database.windows.net:1433;databaseName=your_db;user=your_user;password=your_password;encrypt=true;trustServerCertificate=false;hostNameInCertificate=your-server-name.database.windows.net;";
使用 JNDI (Java Naming and Directory Interface) (企业级应用)
在像 Tomcat、JBoss/WildFly 这样的 Java Web 应用服务器中,最佳实践是使用 JNDI,你将数据库连接池的配置放在服务器的配置文件中(如 context.xml),然后在应用中通过 JNDI 名称查找数据源。
优点:
- 配置与代码分离: 数据库信息不在代码中,修改配置无需重新编译应用。
- 连接池: 自动管理数据库连接,提高性能和稳定性。
- 安全性: 敏感的数据库凭据可以由服务器安全管理。
Tomcat 中的 context.xml 示例:
<Context>
<Resource name="jdbc/MySqlDS"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=YourDB;encrypt=true;trustServerCertificate=true;"
username="your_user"
password="your_password"
maxTotal="20"
maxIdle="10"
maxWaitMillis="10000"/>
</Context>
Java 代码中查找 JNDI 数据源:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class JndiConnector {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 获取 JNDI 上下文
Context initContext = new InitialContext();
// 2. 查找数据源
DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/MySqlDS");
// 3. 从数据源获取连接
conn = ds.getConnection();
System.out.println("通过 JNDI 连接成功!");
// ... 执行 SQL 操作 ...
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4. 关闭连接 (连接池会回收它)
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
常见问题与解决方案
-
ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver- 原因: JDBC 驱动 JAR 文件没有被添加到项目的类路径中。
- 解决: 检查你的项目配置,确保
mssql-jdbc.jar已正确添加。
-
The TCP/IP connection to the host has failed- 原因:
- SQL Server 服务未启动。
- 防火墙阻止了到端口
1433的连接。 - 服务器地址或端口号错误。
- 解决:
- 确保目标机器上的 SQL Server 服务正在运行。
- 检查 Windows 防火墙或网络防火墙规则,允许 TCP 端口
1433的入站连接。 - 验证
DB_URL中的server_name和port是否正确。
- 原因:
-
Login failed for user '...'- 原因: 用户名或密码错误,或者该用户没有权限访问指定的数据库。
- 解决: 检查
USER和PASS变量是否正确,可以在 SQL Server Management Studio (SSMS) 中手动验证凭据。
-
The driver could not establish a secure connection to SQL Server due to an error in an SSL library- 原因: 尝试加密连接,但 SSL/TLS 配置有问题(证书验证失败)。
- 解决:
- 对于开发/测试,可以在连接字符串中添加
trustServerCertificate=true来绕过证书验证。 - 对于生产环境,你需要正确配置服务器和客户端的受信任证书。
- 对于开发/测试,可以在连接字符串中添加
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Microsoft JDBC Driver | 简单直接,官方支持,适合所有 Java 应用。 | 需要手动管理连接(或自己实现连接池),配置与代码耦合。 | 简单的命令行应用、桌面应用、小型 Web 应用。 |
| JNDI + 连接池 | 配置与代码分离,性能高(连接池),企业级标准。 | 配置相对复杂,需要应用服务器支持。 | 中大型 Web 应用(如 Spring Boot, Tomcat, JBoss)。 |
对于初学者,从 方式一 开始是最好的选择,对于构建生产级 Web 应用,强烈推荐学习和使用 方式二 或 Spring Boot 等框架内置的连接池管理机制。
