总体步骤
- 下载并安装 SQL Server JDBC 驱动:这是 Java 程序与 SQL Server 数据库通信的桥梁。
- 配置 Java 项目:将 JDBC 驱动添加到你的项目中。
- 编写 Java 连接代码:使用 JDBC API 建立连接、执行操作、处理结果并关闭资源。
- 处理异常和资源:确保数据库连接等资源被正确关闭,避免内存泄漏。
第一步:下载并配置 JDBC 驱动
微软提供了官方的 JDBC 驱动,你需要下载适用于你 Java 版本和 SQL Server 版本的驱动。

下载驱动
- 访问官网:前往 Microsoft 的 JDBC 驱动下载页面:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
- 选择版本:
- 选择版本:通常选择最新的稳定版即可。
- 下载文件:下载一个
.zip压缩包。
在项目中添加驱动
你需要将下载的 .zip 文件中的 JDBC 驱动 JAR 包添加到你的 Java 项目的类路径中。
对于 Maven 项目 (推荐)
这是最简单、最推荐的方式,你只需在 pom.xml 文件中添加以下依赖,Maven 会自动帮你下载和管理驱动。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<!--
请根据你的需求选择版本。
8.x 版本支持 Java 8, 11, 14, 17 等。
12.x 版本支持 Java 17, 21 等。
-->
<version>12.6.4.jre11</version>
</dependency>
对于 Gradle 项目

在 build.gradle 文件中添加:
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.6.4.jre11'
对于手动管理的项目 (IDE 或普通 JAR)
- 解压你下载的
.zip文件。 - 在解压后的目录中,找到一个名为
mssql-jdbc-版本号.jre11.jar(或.jre8.jar,.jre17.jar等) 的文件。 - 将此 JAR 文件复制到你的项目目录下。
- 在你的 IDE (如 IntelliJ IDEA 或 Eclipse) 中,右键点击项目 -> Build Path / Project Structure -> Libraries -> Add JARs / External JARs,然后选择这个 JAR 文件即可。
第二步:编写 Java 连接代码
下面是一个完整的、带有详细注释的 Java 示例,展示了如何连接到 SQL Server,执行查询,并处理结果。
示例代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlServerConnector {
// 数据库连接信息
// 注意:SQL Server 配置了非默认端口,需要在 URL 中指定, 1433
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)) {
if (conn != null) {
System.out.println("连接成功!");
// --- 示例1:执行简单的查询 ---
System.out.println("\n--- 执行简单查询 ---");
selectData(conn);
// --- 示例2:使用 PreparedStatement 执行参数化查询 (防止SQL注入) ---
System.out.println("\n--- 执行参数化查询 ---");
selectDataWithParameter(conn, "某个员工姓名");
}
} catch (SQLException e) {
System.err.println("连接数据库失败!");
e.printStackTrace();
}
}
/**
* 执行一个简单的 SELECT 查询
*/
private static void selectData(Connection conn) throws SQLException {
String sql = "SELECT id, name, email FROM Employees";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
System.out.println("ID\tName\tEmail");
while (rs.next()) {
// 通过列名获取数据,更安全、可读性更好
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println(id + "\t" + name + "\t" + email);
}
}
}
/**
* 使用 PreparedStatement 执行带参数的查询
*/
private static void selectDataWithParameter(Connection conn, String employeeName) throws SQLException {
// 使用 ? 作为占位符
String sql = "SELECT id, name, email FROM Employees WHERE name = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数,索引从 1 开始
pstmt.setString(1, employeeName);
try (ResultSet rs = pstmt.executeQuery()) {
System.out.println("查找姓名为 '" + employeeName + "' 的员工:");
System.out.println("ID\tName\tEmail");
if (!rs.isBeforeFirst()) {
System.out.println("没有找到匹配的记录。");
}
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println(id + "\t" + name + "\t" + email);
}
}
}
}
}
第三步:连接 URL 参数详解
连接 URL 是关键,这里解释一下常用参数:

jdbc:sqlserver://[server_name][:port];[database_name=<db_name>];[property=value[;property=value]]
jdbc:sqlserver://: 固定协议头。localhost: 你的 SQL Server 实例所在的主机名或 IP 地址,如果是本地,localhost或0.0.1都可以。1433: SQL Server 的默认端口,如果你的实例使用了非默认端口,必须指定。databaseName=YourDatabaseName: 必须指定要连接的数据库名称。encrypt=true;trustServerCertificate=true;: 强烈推荐,尤其是在本地开发时。encrypt=true: 启用 TLS/SSL 加密。trustServerCertificate=true: 信任服务器提供的 SSL 证书,而无需将其安装到客户端的信任存储中,这在开发环境中非常方便,但在生产环境中,你应该配置正确的证书。
其他常见参数:
user: 数据库用户名。password: 数据库密码。integratedSecurity=true: 使用 Windows 身份验证(集成安全),而不是用户名和密码,URL 中不应包含user和password。- 示例:
jdbc:sqlserver://localhost;databaseName=master;integratedSecurity=true;
- 示例:
第四步:常见问题与排查
ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
- 原因:JVM 在运行时找不到 SQL Server 的 JDBC 驱动类,这通常意味着你没有将 JDBC 驱动的 JAR 文件正确地添加到项目的类路径中。
- 解决方案:
- 检查你的
pom.xml或build.gradle文件,依赖是否正确添加。 - 如果是手动添加,检查 IDE 的 Build Path / Libraries 设置,确保 JAR 文件被正确包含。
- 如果你使用的是命令行
java -jar运行,请确保 JAR 文件在-cp(classpath) 参数中。
- 检查你的
The TCP/IP connection to the host has failed
- 原因:Java 应用程序无法通过网络连接到 SQL Server 服务。
- 解决方案:
- 检查 SQL Server 服务是否正在运行:在 Windows 服务中找到 "SQL Server" 相关服务,确保其状态为 "正在运行"。
- 检查防火墙:Windows 防火墙或其他网络安全软件可能阻止了 1433 端口的连接,尝试暂时关闭防火墙进行测试,或添加入站规则允许 1433 端口。
- 检查 SQL Server 配置管理器:
- 打开 "SQL Server Configuration Manager"。
- 展开 "SQL Server 网络配置"。
- 选中你的 SQL Server 实例(如
SQLEXPRESS的TCP/IP)。 - 右键点击 "启动",并确保其 "已启用"。
- 双击 "TCP/IP",在 "IP 地址" 选项卡中,确保
IPAll下的TCP 动态端口为空,TCP 端口设置为1433(或其他你想要的端口)。
Login failed for user '...'
- 原因:提供的用户名或密码错误,或者该用户没有权限访问指定的数据库。
- 解决方案:
- 核对用户名和密码:确保拼写完全正确。
- 检查用户权限:登录到 SQL Server Management Studio (SSMS),使用该用户名登录,并检查它是否有权限访问
YourDatabaseName数据库。 - 使用
sa用户测试:sa是 SQL Server 的系统管理员账户,如果用sa可以连接,说明是权限问题,需要为你的用户授予相应数据库的访问权限。
The driver could not establish a secure connection to SQL Server due to authentication of the certificate failed
- 原因:启用了加密 (
encrypt=true),但客户端不信任 SQL Server 提供的 SSL 证书。 - 解决方案:
- 开发环境:在 URL 中添加
trustServerCertificate=true,如示例代码所示,这会跳过证书验证。 - 生产环境:不要使用
trustServerCertificate=true,你应该从你的数据库管理员那里获取有效的 SSL 证书,并将其导入到你运行 Java 应用程序的机器的 Java 信任库 (cacerts) 中。
- 开发环境:在 URL 中添加
最佳实践
- 使用连接池:在高并发应用中,频繁地创建和销毁数据库连接是非常消耗资源的,应该使用连接池(如 HikariCP, Apache DBCP, C3P0)来管理和复用连接。
- HikariCP 是目前性能最好的连接池之一。
- 使用
PreparedStatement:对于所有包含用户输入的 SQL 查询,都应该使用PreparedStatement,它可以有效防止 SQL 注入攻击,并且对于数据库可以预编译 SQL,提高执行效率。 - 使用
try-with-resources:从 Java 7 开始,try-with-resources语句可以确保实现了AutoCloseable接口的对象(如Connection,Statement,ResultSet)在try块执行完毕后自动关闭,即使发生异常也能保证资源被释放,避免资源泄漏。 - 不要硬编码凭据:不要在代码中直接写用户名和密码,应该使用配置文件(如
config.properties)、环境变量或专门的密钥管理服务来存储敏感信息。 - 处理异常:始终妥善处理
SQLException,记录详细的错误日志,以便于排查问题。
