Java 应用程序通过 JDBC (Java Database Connectivity) API 来连接和操作数据库,JDBC 是 Java 标准的一部分,它定义了一组接口和类,允许 Java 程序执行 SQL 语句。
整个过程可以分为以下几个核心步骤:
- 准备环境:安装 SQL Server 数据库和 Java 开发环境。
- 获取 JDBC 驱动:下载 SQL Server 的 JDBC 驱动程序(JAR 包)。
- 配置项目:将 JDBC 驱动 JAR 包添加到你的 Java 项目中。
- 编写 Java 代码:使用 JDBC API 加载驱动、建立连接、执行 SQL、处理结果、关闭资源。
第一步:环境准备
-
SQL Server 数据库:
- 确保你有一台可访问的 SQL Server 实例(可以是本地安装的,也可以是远程服务器)。
- 知道你的服务器地址(
localhost或 IP 地址)、端口号(默认为1433)、数据库名称。 - 拥有一个有效的用户名和密码。
-
Java 开发环境:
- 安装 JDK (Java Development Kit)。
- 安装一个 IDE(如 IntelliJ IDEA, Eclipse, VS Code)。
第二步:获取 JDBC 驱动
你需要下载 Microsoft 提供的官方 JDBC 驱动,这个驱动是连接 Java 和 SQL Server 的桥梁。
-
下载地址:
- 官方下载页面:Microsoft JDBC Drivers for SQL Server
- 你可以根据你的 JDK 版本选择合适的驱动,一个较新的驱动(如 11.2.x)可以兼容多个 JDK 版本。
-
下载文件:
- 下载后会得到一个
.zip压缩包。 - 解压后,在
mssql-jdbc-x.x.x.jre11.jar(或jre8,jre17等) 文件夹下,你会找到一个或多个 JAR 文件。mssql-jdbc-11.2.1.jre11.jar:适用于 Java 11 及以上版本。mssql-jdbc-11.2.1.jre8.jar:适用于 Java 8。
- 下载后会得到一个
第三步:配置项目
你需要将下载的 JDBC 驱动 JAR 文件添加到你的 Java 项目的类路径中。
在 IDE 中添加(以 IntelliJ IDEA 为例)
- 打开你的项目。
- 找到项目结构(
File->Project Structure...或File->Project Structure...)。 - 选择
Modules->Dependencies选项卡。 - 点击 号,选择
JARs or directories...。 - 浏览并选择你刚刚下载的 JDBC 驱动 JAR 文件(
mssql-jdbc-11.2.1.jre11.jar)。 - 点击
OK,确保Scope设置为Compile或Runtime。
在 Maven 项目中添加(推荐方式)
如果你使用 Maven 来管理项目,这是最简单、最推荐的方式,只需在 pom.xml 文件中添加依赖即可。
<dependencies>
<!-- Microsoft JDBC Driver for SQL Server -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<!-- 根据你的JDK版本选择合适的版本 -->
<version>11.2.1.jre11</version>
</dependency>
</dependencies>
Maven 会自动帮你下载和管理这个依赖。
第四步:编写 Java 代码
下面是一个完整的、分步的示例代码,展示了如何连接到 SQL Server 数据库并执行查询。
准备数据库表和数据
在 SQL Server 中,执行以下 T-SQL 语句创建一个示例表并插入一些数据:
CREATE DATABASE MyJavaDB;
GO
USE MyJavaDB;
GO
CREATE TABLE Employees (
id INT PRIMARY KEY IDENTITY(1,1),
name NVARCHAR(50),
department NVARCHAR(50),
salary DECIMAL(10, 2)
);
INSERT INTO Employees (name, department, salary) VALUES
('张三', '研发部', 8000.00),
('李四', '市场部', 7500.50),
('王五', '研发部', 9200.00);
GO
Java 代码实现
最佳实践:使用 try-with-resources 语句来自动管理资源(如 Connection, Statement, ResultSet),这样可以确保它们在使用后被正确关闭,避免资源泄漏。
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 SqlServerJdbcExample {
// --- 数据库连接信息 ---
// 请根据你的实际情况修改这些值
private static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=MyJavaDB;encrypt=false;trustServerCertificate=true";
private static final String USER = "sa"; // 你的SQL Server用户名
private static final String PASS = "your_password"; // 你的SQL Server密码
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, department, salary FROM Employees")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("连接到 SQL Server 成功!");
}
System.out.println("-----------------------------------------------------------------");
System.out.printf("%-5s %-20s %-15s %-10s%n", "ID", "姓名", "部门", "薪水");
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("%-5d %-20s %-15s %-10.2f%n", id, name, department, salary);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("数据库连接或查询失败!");
e.printStackTrace();
}
}
}
使用 PreparedStatement 防止 SQL 注入
对于用户输入的查询,强烈推荐使用 PreparedStatement,因为它可以有效地防止 SQL 注入攻击。
public class PreparedStatementExample {
private static final String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=MyJavaDB;encrypt=false;trustServerCertificate=true";
private static final String USER = "sa";
private static final String PASS = "your_password";
public static void main(String[] args) {
String departmentToFind = "研发部";
// SQL 查询语句,使用 ? 作为占位符
String sql = "SELECT id, name, department, salary FROM Employees WHERE department = ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 创建 PreparedStatement 对象
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置占位符的值 (索引从 1 开始)
pstmt.setString(1, departmentToFind);
// 执行查询
try (ResultSet rs = pstmt.executeQuery()) {
System.out.println("研发部的员工信息:");
System.out.println("-----------------------------------------------------------------");
System.out.printf("%-5s %-20s %-15s %-10s%n", "ID", "姓名", "部门", "薪水");
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("%-5d %-20s %-15s %-10.2f%n", id, name, department, salary);
}
}
} catch (SQLException e) {
System.err.println("PreparedStatement 查询失败!");
e.printStackTrace();
}
}
}
常见问题与解决方案
连接字符串问题
这是最常见的问题,连接字符串的正确格式至关重要:
jdbc:sqlserver://[server_name][:port];databaseName=[database_name];[property=value;...]
encrypt=false;trustServerCertificate=true:- 对于本地开发或测试环境,这可以简化 SSL/TLS 连接的配置,避免证书验证问题。
- 在生产环境中,你应该配置正确的 SSL 加密和证书,以保障数据安全。
integratedSecurity=true:- 如果你想使用 Windows 身份验证(即使用当前登录 Windows 用户的身份去连接 SQL Server),而不是用户名和密码,可以这样设置。
- 连接字符串示例:
jdbc:sqlserver://localhost:1433;databaseName=MyJavaDB;integratedSecurity=true;
驱动类未找到错误 (ClassNotFoundException)
错误信息:java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
原因:JDBC 驱动的 JAR 文件没有被正确地添加到项目的类路径中。
解决方案:
- 确认你已下载了正确的 JDBC 驱动 JAR 文件。
- 确认你已将该 JAR 文件添加到了 IDE 的库/依赖项中,或者 Maven/Gradle 的依赖列表中。
- 如果你使用命令行编译和运行,请确保在
java命令中使用-cp或-classpath参数指定 JAR 文件的路径。# 示例命令行运行 java -cp ".;C:\path\to\your\mssql-jdbc-11.2.1.jre11.jar" YourClassName
网络或认证问题
错误信息:The TCP/IP connection to the host has failed 或 Login failed for user 'sa'
原因:
- SQL Server 服务未启动。
- 防火墙阻止了
1433端口。 - 服务器地址、端口号、用户名或密码错误。
- SQL Server 的身份验证模式设置为“Windows 身份验证”,但你尝试使用 SQL Server 身份验证(用户名/密码),你需要将 SQL Server 混合模式认证,或者使用
integratedSecurity=true。
解决方案:
- 检查 SQL Server 服务是否正在运行。
- 检查 Windows 防火墙或云服务商的安全组,确保
1433端口已开放。 - 仔细核对连接字符串中的所有信息。
- 在 SQL Server Management Studio (SSMS) 中,使用相同的凭据尝试登录,以验证凭据是否正确。
| 步骤 | 关键点 |
|---|---|
| 环境准备 | 确保 SQL Server 和 JDK 已安装并可用。 |
| 获取驱动 | 从微软官网下载 JDBC 驱动 JAR 文件。 |
| 配置项目 | 推荐使用 Maven,手动将 JAR 添加到项目类路径。 |
| 编写代码 | 使用 try-with-resources 自动关闭资源。优先使用 PreparedStatement 防止 SQL 注入。 |
| 连接字符串 | 格式要正确,注意 encrypt 和 trustServerCertificate 等属性。 |
| 错误处理 | ClassNotFoundException 检查类路径;SQLException 检查网络、认证和 SQL 语法。 |
遵循以上指南,你就可以成功地在 Java 应用程序中连接和操作 SQL Server 数据库了。
