核心概念
在开始之前,需要理解几个基本概念:

- JDBC (Java Database Connectivity): Java 提供的一套用于执行 SQL 语句的 API,它本身是一个接口规范,由不同的数据库厂商(如 Microsoft, Oracle)来实现具体的驱动程序。
- JDBC Driver (驱动程序): 这是连接 Java 应用和数据库的“桥梁”,你需要为 SQL Server 数据库下载并引入对应的 JDBC Driver。
- Connection String (连接字符串): 一个包含数据库连接信息的特殊格式的字符串,告诉 JDBC Driver 如何连接到数据库,它通常包括服务器地址、端口、数据库名、用户名和密码。
环境准备
1. 准备 SQL Server 数据库
确保你有一个可用的 SQL Server 实例,并且已经创建了一个要连接的数据库。
我们创建一个名为 mytestdb 的数据库,并在其中创建一个 students 表:
-- 创建数据库 (如果不存在)
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'mytestdb')
BEGIN
CREATE DATABASE mytestdb;
END
GO
USE mytestdb;
GO
-- 创建学生表 (如果不存在)
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='students' and xtype='U')
BEGIN
CREATE TABLE students (
id INT PRIMARY KEY IDENTITY(1,1),
name NVARCHAR(50) NOT NULL,
age INT,
enrollment_date DATE
);
END
GO
-- 插入一些测试数据
INSERT INTO students (name, age, enrollment_date) VALUES
('张三', 20, '2025-09-01'),
('李四', 21, '2025-09-01'),
('王五', 22, '2025-09-02');
GO
2. 下载 SQL Server JDBC Driver
你需要从 Microsoft 官网下载 JDBC Driver。
- 访问下载页面: Microsoft JDBC Driver for SQL Server
- 选择版本: 根据你的 Java 版本和 SQL Server 版本选择合适的驱动,对于大多数新项目,推荐使用 JDBC 8.4 (或更高版本),因为它支持 Java 8 到 Java 17+。
- 下载: 下载后你会得到一个
.zip压缩包。 - 添加到项目: 解压压缩包,找到
mssql-jdbc-<version>.jar文件(mssql-jdbc-11.2.3.jre17.jar),你需要将这个 JAR 文件添加到你的 Java 项目的类路径中。
如何添加 JAR 文件到项目:

- IDE (如 IntelliJ IDEA 或 Eclipse): 右键你的项目 ->
Open Module Settings/Build Path->Libraries->Add External JARs...-> 选择你下载的 JAR 文件。 - Maven 项目: 在你的
pom.xml文件中添加以下依赖。 - Gradle 项目: 在你的
build.gradle文件中添加以下依赖。
Maven pom.xml 依赖:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>11.2.3.jre17</version> <!-- 请使用最新的版本号 -->
</dependency>
Gradle build.gradle 依赖:
implementation 'com.microsoft.sqlserver:mssql-jdbc:11.2.3.jre17' // 请使用最新的版本号
连接字符串
连接字符串是成功连接的关键,SQL Server 的连接字符串格式如下:
jdbc:sqlserver://[server_name][:port];databaseName=[db_name];user=[user];password=[password];
jdbc:sqlserver://: 协定头,固定不变。[server_name]: SQL Server 服务器的地址,可以是:localhost或0.0.1(如果数据库在本地运行)- 远程服务器的 IP 地址或主机名 (如
168.1.100或SERVER01)
[:port]: 端口号,SQL Server 默认端口是1433,如果使用默认端口,可以省略1433。databaseName=[db_name]: 你要连接的数据库名称 (mytestdb)。user=[user]: 数据库的用户名 (sa)。password=[password]: 对应用户的密码。
示例连接字符串:

- 本地连接,默认端口:
jdbc:sqlserver://localhost;databaseName=mytestdb;user=sa;password=your_password; - 远程连接,指定端口:
jdbc:sqlserver=my-server.com;port=1433;databaseName=mytestdb;user=myuser;password=mypassword;
Java 代码示例
下面是一个完整的 Java 类,演示了如何连接到 SQL Server,执行查询,并处理结果。
最佳实践: 使用 try-with-resources 语句来自动关闭 Connection, Statement, 和 ResultSet,防止资源泄漏。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlServerJdbcExample {
// --- 请根据你的环境修改以下信息 ---
private static final String DB_URL = "jdbc:sqlserver://localhost;databaseName=mytestdb;encrypt=false;trustServerCertificate=true;";
private static final String USER = "sa";
private static final String PASS = "your_password"; // 替换为你的 sa 密码
// ------------------------------------
public static void main(String[] args) {
// 使用 try-with-resources 确保 Connection, Statement, ResultSet 被自动关闭
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM students")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("成功连接到 SQL Server 数据库!");
}
System.out.println("----- 学生列表 -----");
// 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更安全且可读性更好
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
// 输出数据
System.out.println("ID: " + id + ", 姓名: " + name + ", 年龄: " + age);
}
} catch (SQLException e) {
// 处理 SQL 异常
System.err.println("数据库连接或查询失败: " + e.getMessage());
e.printStackTrace();
}
}
}
代码解释:
-
加载驱动 (在现代 JDBC 驱动中可选): 在较旧的版本中,需要显式加载驱动:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");,但从 JDBC 4.0 (Java 6) 开始,只要驱动 JAR 在类路径中,驱动管理器会自动加载驱动,所以这行代码通常可以省略。 -
获取连接 (
DriverManager.getConnection): 这是建立连接的核心方法,它接收连接字符串、用户名和密码作为参数,并返回一个Connection对象。 -
创建语句 (
conn.createStatement):Connection对象用于创建Statement对象,Statement用于执行 SQL 查询。 -
执行查询 (
stmt.executeQuery): 执行一个 SQLSELECT查询,并返回一个ResultSet对象,该对象包含了查询的结果集。 -
处理结果 (
rs.next()和rs.getXXX):rs.next(): 将光标移动到结果集的下一行,如果下一行存在,返回true,否则返回false,通常用于while循环来遍历所有行。rs.getString("name"),rs.getInt("age"): 根据列名或列索引获取当前行的数据,推荐使用列名,因为代码更具可读性,并且在表结构微调(如列顺序改变)时不易出错。
-
资源管理 (
try-with-resources):try语句中的括号内声明的资源(实现了AutoCloseable接口,如Connection,Statement,ResultSet)会在try块执行完毕后自动调用其 `close
