杰瑞科技汇

Java如何连接SQLServer数据库?

核心概念

要连接 SQL Server,Java 程序需要一个 JDBC (Java Database Connectivity) 驱动程序,这个驱动程序充当了 Java 代码和 SQL Server 数据库之间的“翻译官”,让 Java 能够发送 SQL 命令并处理返回的结果。

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

使用 Microsoft 官方 JDBC 驱动 (推荐)

这是最直接、最稳定的方式,由微软官方提供和维护。

步骤 1: 下载 JDBC 驱动

  1. 访问微软官方 JDBC 驱动下载页面: Microsoft JDBC Drivers for SQL Server
  2. 根据你的 Java 版本和 SQL Server 版本选择合适的驱动,对于大多数现代项目,选择 "Download" 链接下的 JAR 文件即可。
  3. 下载后,你会得到一个 ZIP 压缩包,mssql-jdbc-12.4.2.jre11.jar

步骤 2: 将驱动添加到项目中

你需要将下载的 JAR 文件添加到你的项目的类路径中。

对于 Maven 项目 (推荐):

在你的 pom.xml 文件中添加以下依赖,Maven 会自动管理依赖和版本。

Java如何连接SQLServer数据库?-图2
(图片来源网络,侵删)
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.2.jre11</version> <!-- 请使用你下载的最新版本 -->
    <scope>runtime</scope>
</dependency>

对于 Gradle 项目:

在你的 build.gradle 文件中添加以下依赖。

implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre11' // 请使用你下载的最新版本

对于手动项目 (如 Eclipse, IntelliJ IDEA):

  1. 右键点击你的项目 -> Build Path / Project Structure。
  2. 找到 Libraries / Dependencies 选项。
  3. 点击 "Add External JARs..." 或 "Add" 按钮。
  4. 选择你下载的 mssql-jdbc-*.jar 文件。

步骤 3: 编写 Java 连接代码

这是核心部分,连接字符串是关键。

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

连接字符串格式:

jdbc:sqlserver://[server_name][:port];[database_name];[user];[password];[additional_properties]
  • server_name: SQL Server 的地址,可以是主机名、IP 地址或域名。
  • port: SQL Server 的监听端口,默认为 1433
  • database_name: 你要连接的数据库名称。
  • user: 登录用户名。
  • password: 登录密码。
  • additional_properties: 其他可选配置,如 encrypt=true, trustServerCertificate=true 等。

完整代码示例

下面是一个使用 try-with-resources 语句的完整、健壮的连接示例。try-with-resources 可以确保连接、语句和结果集在使用后被自动关闭,避免资源泄漏。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlServerConnector {
    // 数据库连接信息 - 建议从配置文件中读取,而不是硬编码
    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);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Hello, SQL Server!' AS message")) {
            // 检查连接是否成功
            if (conn != null) {
                System.out.println("连接成功!");
            }
            // 处理查询结果
            while (rs.next()) {
                // 假设查询返回一个名为 "message" 的列
                String message = rs.getString("message");
                System.out.println("查询结果: " + message);
            }
        } catch (SQLException e) {
            // 捕获并处理 SQL 异常
            System.err.println("连接数据库失败!");
            e.printStackTrace();
        }
    }
}

连接字符串中的重要参数 (Azure 和本地 SQL Server)

现代 SQL Server(特别是 Azure SQL)通常建议使用加密连接,以下是一些常用参数:

  • encrypt=true;: 强制驱动程序使用 SSL/TLS 加密与服务器之间的通信。对于 Azure SQL,这是必需的。
  • trustServerCertificate=true;: 告诉驱动程序信任服务器提供的 SSL 证书,而不验证其是否由受信任的证书颁发机构颁发,这在开发和测试环境中非常方便,但在生产环境中不安全,应该配置正确的证书。
  • hostNameInCertificate=your_server_name.database.windows.net;: 如果服务器名称和证书中的名称不完全匹配,使用此参数指定证书中预期的主机名。

示例 (连接到 Azure SQL):

String azureUrl = "jdbc:sqlserver://your-server-name.database.windows.net:1433;databaseName=your_db;user=your_user;password=your_password;encrypt=true;trustServerCertificate=false;hostNameInCertificate=your-server-name.database.windows.net;";

使用 JNDI (Java Naming and Directory Interface) (企业级应用)

在像 Tomcat、JBoss/WildFly 这样的 Java Web 应用服务器中,最佳实践是使用 JNDI,你将数据库连接池的配置放在服务器的配置文件中(如 context.xml),然后在应用中通过 JNDI 名称查找数据源。

优点:

  • 配置与代码分离: 数据库信息不在代码中,修改配置无需重新编译应用。
  • 连接池: 自动管理数据库连接,提高性能和稳定性。
  • 安全性: 敏感的数据库凭据可以由服务器安全管理。

Tomcat 中的 context.xml 示例:

<Context>
    <Resource name="jdbc/MySqlDS"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
              url="jdbc:sqlserver://localhost:1433;databaseName=YourDB;encrypt=true;trustServerCertificate=true;"
              username="your_user"
              password="your_password"
              maxTotal="20"
              maxIdle="10"
              maxWaitMillis="10000"/>
</Context>

Java 代码中查找 JNDI 数据源:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class JndiConnector {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 1. 获取 JNDI 上下文
            Context initContext = new InitialContext();
            // 2. 查找数据源
            DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/MySqlDS");
            // 3. 从数据源获取连接
            conn = ds.getConnection();
            System.out.println("通过 JNDI 连接成功!");
            // ... 执行 SQL 操作 ...
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4. 关闭连接 (连接池会回收它)
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

常见问题与解决方案

  1. ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

    • 原因: JDBC 驱动 JAR 文件没有被添加到项目的类路径中。
    • 解决: 检查你的项目配置,确保 mssql-jdbc.jar 已正确添加。
  2. The TCP/IP connection to the host has failed

    • 原因:
      • SQL Server 服务未启动。
      • 防火墙阻止了到端口 1433 的连接。
      • 服务器地址或端口号错误。
    • 解决:
      • 确保目标机器上的 SQL Server 服务正在运行。
      • 检查 Windows 防火墙或网络防火墙规则,允许 TCP 端口 1433 的入站连接。
      • 验证 DB_URL 中的 server_nameport 是否正确。
  3. Login failed for user '...'

    • 原因: 用户名或密码错误,或者该用户没有权限访问指定的数据库。
    • 解决: 检查 USERPASS 变量是否正确,可以在 SQL Server Management Studio (SSMS) 中手动验证凭据。
  4. The driver could not establish a secure connection to SQL Server due to an error in an SSL library

    • 原因: 尝试加密连接,但 SSL/TLS 配置有问题(证书验证失败)。
    • 解决:
      • 对于开发/测试,可以在连接字符串中添加 trustServerCertificate=true 来绕过证书验证。
      • 对于生产环境,你需要正确配置服务器和客户端的受信任证书。
方式 优点 缺点 适用场景
Microsoft JDBC Driver 简单直接,官方支持,适合所有 Java 应用。 需要手动管理连接(或自己实现连接池),配置与代码耦合。 简单的命令行应用、桌面应用、小型 Web 应用。
JNDI + 连接池 配置与代码分离,性能高(连接池),企业级标准。 配置相对复杂,需要应用服务器支持。 中大型 Web 应用(如 Spring Boot, Tomcat, JBoss)。

对于初学者,从 方式一 开始是最好的选择,对于构建生产级 Web 应用,强烈推荐学习和使用 方式二 或 Spring Boot 等框架内置的连接池管理机制。

分享:
扫描分享到社交APP
上一篇
下一篇