目录
- 准备工作
- 安装 SQL Server 数据库
- 创建数据库和测试表
- 获取数据库连接信息
- 添加 JDBC 驱动依赖
- 使用 Maven (推荐)
- 手动下载 JAR 包
- 编写 Java 连接代码
- 核心步骤解析
- 完整示例代码 (JDBC 4.0+)
- 使用
try-with-resources(最佳实践)
- 执行 SQL 查询 (增删改查)
- 查询数据 (
SELECT) - 插入/更新/删除数据 (
INSERT,UPDATE,DELETE)
- 查询数据 (
- 常见问题与解决方案
ClassNotFoundExceptionSQLException: The TCP/IP connection to the host...Login failed for user '...'- 连接字符串格式错误
- 高级配置
- 连接池 (HikariCP 推荐)
- 配置 SSL 加密
准备工作
在编写 Java 代码之前,你需要确保你的 SQL Server 环境已经准备就绪。

a. 安装 SQL Server 数据库
如果你还没有安装 SQL Server,可以从 Microsoft 官网 下载并安装一个版本(如 Express 版本是免费的)。
b. 创建数据库和测试表
使用 SQL Server Management Studio (SSMS) 或其他工具连接到你的 SQL Server 实例,然后执行以下 SQL 脚本创建一个测试数据库和表:
-- 创建一个名为 'TestDB' 的数据库
CREATE DATABASE TestDB;
GO
-- 使用新创建的数据库
USE TestDB;
GO
-- 创建一个名为 'Employees' 的表
CREATE TABLE Employees (
id INT PRIMARY KEY IDENTITY(1,1),
name NVARCHAR(50) NOT NULL,
department NVARCHAR(50),
salary DECIMAL(10, 2)
);
GO
-- 插入一些测试数据
INSERT INTO Employees (name, department, salary) VALUES
('张三', '研发部', 8500.00),
('李四', '市场部', 7500.50),
('王五', '研发部', 9200.00);
GO
c. 获取数据库连接信息
你需要记录下以下信息,这些是 Java 连接所必需的:
- 服务器名称 (host): 如果是本地,通常是
localhost或0.0.1。 - 端口 (port): 默认是
1433。 - 数据库名称 (databaseName): 我们创建的
TestDB。 - 用户名 (user): 你的 SQL Server 登录名。
- 密码 (password): 你的 SQL Server 密码。
添加 JDBC 驱动依赖
Java 通过 JDBC (Java Database Connectivity) 规范来连接数据库,你需要从 SQL Server 官方下载对应的 JDBC 驱动程序。

推荐方式:使用 Maven (现代项目首选)
如果你的项目使用 Maven 或 Gradle 构建管理,只需在 pom.xml 文件中添加官方 JDBC 驱动的依赖即可,Maven 会自动帮你下载和管理。
<!-- 在你的 <dependencies> 标签内添加 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>11.2.1.jre8</version> <!-- 建议使用最新稳定版 -->
</dependency>
注意: 版本号
2.1.jre8表示该驱动适用于 Java 8,请根据你的 Java 版本选择合适的驱动版本,对于 Java 17,可以使用2.1.jre17。
手动下载 JAR 包
- 访问 Microsoft JDBC Driver for SQL Server 官方下载页面:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server
- 根据你的 Java 版本下载对应的 JAR 文件。
- 将下载的
.jar文件添加到你的项目的CLASSPATH中,或者如果你使用 IDE (如 IntelliJ IDEA, Eclipse),右键项目 -> Build Path / Libraries -> Add External JARs... 并选择你下载的文件。
编写 Java 连接代码
核心步骤解析
连接 SQL Server 的标准 JDBC 步骤如下:
- 加载驱动: 使用
Class.forName()加载 JDBC 驱动类。 - 获取连接: 使用
DriverManager.getConnection()方法,传入连接字符串、用户名和密码,来获取一个Connection对象。 - 创建语句: 通过
Connection对象创建一个Statement或PreparedStatement对象,用于执行 SQL。 - 执行 SQL: 调用
executeQuery()(用于查询) 或executeUpdate()(用于增删改) 方法。 - 处理结果: 如果是查询,会返回一个
ResultSet对象,你需要遍历它来获取数据。 - 关闭资源: 非常重要! 按照后开先关的顺序关闭
ResultSet,Statement,Connection。
完整示例代码 (JDBC 4.0+)
从 JDBC 4.0 开始,如果驱动 JAR 文件在 CLASSPATH 中,通常不需要显式调用 Class.forName(),但为了兼容性和清晰性,推荐保留。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlServerConnectionExample {
// 数据库连接信息 - 建议从配置文件中读取,而不是硬编码
private static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=false;trustServerCertificate=true";
private static final String USER = "sa"; // 你的用户名
private static final String PASS = "your_password"; // 你的密码
public static void main(String[] args) {
// 1. 加载驱动 (对于 JDBC 4.0+ 可选,但推荐)
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
System.err.println("找不到 SQL Server JDBC 驱动!");
e.printStackTrace();
return;
}
// 2. 获取连接
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
if (conn != null) {
System.out.println("连接成功!");
// 3. 创建语句
String sql = "SELECT id, name, department, salary FROM Employees";
Statement stmt = conn.createStatement();
// 4. 执行查询
ResultSet rs = stmt.executeQuery(sql);
// 5. 处理结果集
System.out.println("员工列表:");
while (rs.next()) {
// 通过列名获取数据,更健壮
int id = rs.getInt("id");
String name = rs.getString("name");
String department = rs.getString("department");
double salary = rs.getDouble("salary");
// 输出数据
System.out.printf("ID: %d, 姓名: %s, 部门: %s, 薪资: %.2f%n", id, name, department, salary);
}
// 6. 关闭资源 (在 try-with-resources 中会自动关闭)
rs.close();
stmt.close();
}
} catch (SQLException e) {
System.err.println("数据库连接或查询失败!");
e.printStackTrace();
}
}
}
使用 try-with-resources (最佳实践)
为了确保资源(如 Connection, Statement, ResultSet)在任何情况下都能被正确关闭,强烈推荐使用 Java 7 引入的 try-with-resources 语句,它会自动调用 close() 方法。
// 使用 try-with-resources 的改进版
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, department, salary FROM Employees")) {
if (conn != null) {
System.out.println("连接成功!");
while (rs.next()) {
System.out.printf("ID: %d, 姓名: %s, 部门: %s, 薪资: %.2f%n",
rs.getInt("id"),
rs.getString("name"),
rs.getString("department"),
rs.getDouble("salary"));
}
}
} catch (SQLException e) {
System.err.println("数据库操作失败!");
e.printStackTrace();
}
注意:
try-with-resources要求资源实现了AutoCloseable接口,Connection,Statement,ResultSet都已实现。
执行 SQL 查询 (增删改查)
查询数据 (SELECT)
上面已经展示了 SELECT 的用法,这里不再赘述。
插入/更新/删除数据 (INSERT, UPDATE, DELETE)
这些操作使用 executeUpdate() 方法,它会返回一个整数,表示受影响的行数。
public class DmlExample {
private static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=false;trustServerCertificate=true";
private static final String USER = "sa";
private static final String PASS = "your_password";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
System.out.println("连接成功!");
// --- 插入数据 ---
String insertSql = "INSERT INTO Employees (name, department, salary) VALUES ('赵六', '财务部', 6800.00)";
try (Statement stmt = conn.createStatement()) {
int rowsInserted = stmt.executeUpdate(insertSql);
if (rowsInserted > 0) {
System.out.println("插入成功,影响了 " + rowsInserted + " 行。");
}
}
// --- 更新数据 ---
String updateSql = "UPDATE Employees SET salary = 9500.00 WHERE name = '张三'";
try (Statement stmt = conn.createStatement()) {
int rowsUpdated = stmt.executeUpdate(updateSql);
if (rowsUpdated > 0) {
System.out.println("更新成功,影响了 " + rowsUpdated + " 行。");
}
}
// --- 删除数据 ---
String deleteSql = "DELETE FROM Employees WHERE name = '李四'";
try (Statement stmt = conn.createStatement()) {
int rowsDeleted = stmt.executeUpdate(deleteSql);
if (rowsDeleted > 0) {
System.out.println("删除成功,影响了 " + rowsDeleted + " 行。");
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
常见问题与解决方案
a. ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
- 原因: JVM 找不到 SQL Server JDBC 驱动的类文件。
- 解决方案:
- 确认你的项目中已经正确添加了
mssql-jdbc.jar文件。 - 如果你使用 Maven,检查
pom.xml中的依赖是否正确配置,并刷新项目。 - 如果你手动添加了 JAR,确保它在
CLASSPATH中或在 IDE 的库路径里。
- 确认你的项目中已经正确添加了
b. SQLException: The TCP/IP connection to the host has failed
- 原因: Java 应用无法通过网络连接到 SQL Server 服务,这是最常见的问题。
- 解决方案:
- 检查 SQL Server 服务: 确保你的 SQL Server 服务正在运行,在 Windows 上,可以通过 "服务" 应用查看 "SQL Server (MSSQLSERVER)" 是否已启动。
- 检查端口: 确认 SQL Server 监听的端口是否是
1433(默认),如果不是,请在连接字符串中修改端口号,jdbc:sqlserver://localhost:1434;...。 - 检查 SQL Server 配置:
- 打开 SQL Server Configuration Manager。
- 展开 "SQL Server 网络配置" -> "SQLEXPRESS 的协议" (或你的实例名)。
- 确保 TCP/IP 协议是 已启用 的。
- 双击 TCP/IP,在 "IP 地址" 选项卡中,确保 "IPAll" 下的 "TCP 端口" 是
1433。
- 检查防火墙: Windows 防火墙可能阻止了
1433端口的入站连接,你可以暂时关闭防火墙进行测试,或者在防火墙规则中允许1433端口。
c. Login failed for user '...'
- 原因: 用户名或密码错误,或者该用户没有权限访问数据库。
- 解决方案:
- 核对凭证: 仔细检查连接字符串中的
USER和PASS是否完全正确。 - 检查用户: 在 SSMS 中,使用错误的用户名密码尝试登录,看是否能登录,如果不能,说明凭证确实错误。
- 检查权限: 确保该用户有访问
TestDB数据库的权限。
- 核对凭证: 仔细检查连接字符串中的
d. 连接字符串格式错误
- 原因: JDBC URL 格式不正确。
- 标准格式:
jdbc:sqlserver://[server_name[:port]][;databaseName=database][;property=value[;property=value]] - 示例:
jdbc:sqlserver://localhost:1433;databaseName=TestDB
高级配置
a. 连接池 (Connection Pooling)
在高并发应用中,为每个请求都创建一个新的数据库连接是非常消耗资源的,连接池(如 HikariCP, Apache DBCP, C3P0)可以复用已建立的连接,极大地提高性能。
使用 HikariCP (目前性能最好的连接池)
-
添加依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> -
使用示例:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; public class HikariCPExample { public static void main(String[] args) { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=false;trustServerCertificate=true"); config.setUsername("sa"); config.setPassword("your_password"); config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 连接池配置 (可选) config.setMaximumPoolSize(10); // 最大连接数 config.setMinimumIdle(5); // 最小空闲连接数 config.setConnectionTimeout(30000); // 连接超时时间 (毫秒) try (HikariDataSource dataSource = new HikariDataSource(config); Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name FROM Employees")) { System.out.println("从连接池获取连接成功!"); while (rs.next()) { System.out.println("员工: " + rs.getString("name")); } } catch (Exception e) { e.printStackTrace(); } } }
b. 配置 SSL 加密
为了安全,生产环境中强烈建议启用 SSL 加密连接。
-
方式一: 信任服务器证书 (用于测试) 在连接字符串中添加
encrypt=true;trustServerCertificate=true;,这会加密通信,但会信任任何服务器证书,存在安全风险,仅用于开发测试。String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=true;trustServerCertificate=true";
-
方式二: 使用有效证书 (用于生产) 在生产环境中,你应该将 SQL Server 的有效证书导入到 Java 的信任库中(
cacerts),然后移除trustServerCertificate=true,只保留encrypt=true。
希望这份详细的指南能帮助你顺利地在 Java 中连接 SQL Server!
