杰瑞科技汇

Java如何连接SQLServer数据库?

总体步骤

  1. 下载并安装 SQL Server JDBC 驱动:这是 Java 程序与 SQL Server 数据库通信的桥梁。
  2. 配置 Java 项目:将 JDBC 驱动添加到你的项目中。
  3. 编写 Java 连接代码:使用 JDBC API 建立连接、执行操作、处理结果并关闭资源。
  4. 处理异常和资源:确保数据库连接等资源被正确关闭,避免内存泄漏。

第一步:下载并配置 JDBC 驱动

微软提供了官方的 JDBC 驱动,你需要下载适用于你 Java 版本和 SQL Server 版本的驱动。

Java如何连接SQLServer数据库?-图1
(图片来源网络,侵删)

下载驱动

在项目中添加驱动

你需要将下载的 .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 项目

Java如何连接SQLServer数据库?-图2
(图片来源网络,侵删)

build.gradle 文件中添加:

implementation 'com.microsoft.sqlserver:mssql-jdbc:12.6.4.jre11'

对于手动管理的项目 (IDE 或普通 JAR)

  1. 解压你下载的 .zip 文件。
  2. 在解压后的目录中,找到一个名为 mssql-jdbc-版本号.jre11.jar (或 .jre8.jar, .jre17.jar 等) 的文件。
  3. 将此 JAR 文件复制到你的项目目录下。
  4. 在你的 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 是关键,这里解释一下常用参数:

Java如何连接SQLServer数据库?-图3
(图片来源网络,侵删)

jdbc:sqlserver://[server_name][:port];[database_name=<db_name>];[property=value[;property=value]]

  • jdbc:sqlserver://: 固定协议头。
  • localhost: 你的 SQL Server 实例所在的主机名或 IP 地址,如果是本地,localhost0.0.1 都可以。
  • 1433: SQL Server 的默认端口,如果你的实例使用了非默认端口,必须指定。
  • databaseName=YourDatabaseName: 必须指定要连接的数据库名称。
  • encrypt=true;trustServerCertificate=true;: 强烈推荐,尤其是在本地开发时。
    • encrypt=true: 启用 TLS/SSL 加密。
    • trustServerCertificate=true: 信任服务器提供的 SSL 证书,而无需将其安装到客户端的信任存储中,这在开发环境中非常方便,但在生产环境中,你应该配置正确的证书。

其他常见参数:

  • user: 数据库用户名。
  • password: 数据库密码。
  • integratedSecurity=true: 使用 Windows 身份验证(集成安全),而不是用户名和密码,URL 中不应包含 userpassword
    • 示例: jdbc:sqlserver://localhost;databaseName=master;integratedSecurity=true;

第四步:常见问题与排查

ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

  • 原因:JVM 在运行时找不到 SQL Server 的 JDBC 驱动类,这通常意味着你没有将 JDBC 驱动的 JAR 文件正确地添加到项目的类路径中。
  • 解决方案
    1. 检查你的 pom.xmlbuild.gradle 文件,依赖是否正确添加。
    2. 如果是手动添加,检查 IDE 的 Build Path / Libraries 设置,确保 JAR 文件被正确包含。
    3. 如果你使用的是命令行 java -jar 运行,请确保 JAR 文件在 -cp (classpath) 参数中。

The TCP/IP connection to the host has failed

  • 原因:Java 应用程序无法通过网络连接到 SQL Server 服务。
  • 解决方案
    1. 检查 SQL Server 服务是否正在运行:在 Windows 服务中找到 "SQL Server" 相关服务,确保其状态为 "正在运行"。
    2. 检查防火墙:Windows 防火墙或其他网络安全软件可能阻止了 1433 端口的连接,尝试暂时关闭防火墙进行测试,或添加入站规则允许 1433 端口。
    3. 检查 SQL Server 配置管理器
      • 打开 "SQL Server Configuration Manager"。
      • 展开 "SQL Server 网络配置"。
      • 选中你的 SQL Server 实例(如 SQLEXPRESSTCP/IP)。
      • 右键点击 "启动",并确保其 "已启用"。
      • 双击 "TCP/IP",在 "IP 地址" 选项卡中,确保 IPAll 下的 TCP 动态端口 为空,TCP 端口 设置为 1433 (或其他你想要的端口)。

Login failed for user '...'

  • 原因:提供的用户名或密码错误,或者该用户没有权限访问指定的数据库。
  • 解决方案
    1. 核对用户名和密码:确保拼写完全正确。
    2. 检查用户权限:登录到 SQL Server Management Studio (SSMS),使用该用户名登录,并检查它是否有权限访问 YourDatabaseName 数据库。
    3. 使用 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) 中。

最佳实践

  1. 使用连接池:在高并发应用中,频繁地创建和销毁数据库连接是非常消耗资源的,应该使用连接池(如 HikariCP, Apache DBCP, C3P0)来管理和复用连接。
    • HikariCP 是目前性能最好的连接池之一。
  2. 使用 PreparedStatement:对于所有包含用户输入的 SQL 查询,都应该使用 PreparedStatement,它可以有效防止 SQL 注入攻击,并且对于数据库可以预编译 SQL,提高执行效率。
  3. 使用 try-with-resources:从 Java 7 开始,try-with-resources 语句可以确保实现了 AutoCloseable 接口的对象(如 Connection, Statement, ResultSet)在 try 块执行完毕后自动关闭,即使发生异常也能保证资源被释放,避免资源泄漏。
  4. 不要硬编码凭据:不要在代码中直接写用户名和密码,应该使用配置文件(如 config.properties)、环境变量或专门的密钥管理服务来存储敏感信息。
  5. 处理异常:始终妥善处理 SQLException,记录详细的错误日志,以便于排查问题。
分享:
扫描分享到社交APP
上一篇
下一篇