杰瑞科技汇

Java连接SQL Server,配置驱动与URL步骤?

目录

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

准备工作

在编写 Java 代码之前,你需要确保你的 SQL Server 环境已经准备就绪。

Java连接SQL Server,配置驱动与URL步骤?-图1
(图片来源网络,侵删)

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): 如果是本地,通常是 localhost0.0.1
  • 端口 (port): 默认是 1433
  • 数据库名称 (databaseName): 我们创建的 TestDB
  • 用户名 (user): 你的 SQL Server 登录名。
  • 密码 (password): 你的 SQL Server 密码。

添加 JDBC 驱动依赖

Java 通过 JDBC (Java Database Connectivity) 规范来连接数据库,你需要从 SQL Server 官方下载对应的 JDBC 驱动程序。

Java连接SQL Server,配置驱动与URL步骤?-图2
(图片来源网络,侵删)

推荐方式:使用 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 包

  1. 访问 Microsoft JDBC Driver for SQL Server 官方下载页面:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server
  2. 根据你的 Java 版本下载对应的 JAR 文件。
  3. 将下载的 .jar 文件添加到你的项目的 CLASSPATH 中,或者如果你使用 IDE (如 IntelliJ IDEA, Eclipse),右键项目 -> Build Path / Libraries -> Add External JARs... 并选择你下载的文件。

编写 Java 连接代码

核心步骤解析

连接 SQL Server 的标准 JDBC 步骤如下:

  1. 加载驱动: 使用 Class.forName() 加载 JDBC 驱动类。
  2. 获取连接: 使用 DriverManager.getConnection() 方法,传入连接字符串、用户名和密码,来获取一个 Connection 对象。
  3. 创建语句: 通过 Connection 对象创建一个 StatementPreparedStatement 对象,用于执行 SQL。
  4. 执行 SQL: 调用 executeQuery() (用于查询) 或 executeUpdate() (用于增删改) 方法。
  5. 处理结果: 如果是查询,会返回一个 ResultSet 对象,你需要遍历它来获取数据。
  6. 关闭资源: 非常重要! 按照后开先关的顺序关闭 ResultSet, Statement, Connection

完整示例代码 (JDBC 4.0+)

从 JDBC 4.0 开始,如果驱动 JAR 文件在 CLASSPATH 中,通常不需要显式调用 Class.forName(),但为了兼容性和清晰性,推荐保留。

Java连接SQL Server,配置驱动与URL步骤?-图3
(图片来源网络,侵删)
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 驱动的类文件。
  • 解决方案:
    1. 确认你的项目中已经正确添加了 mssql-jdbc.jar 文件。
    2. 如果你使用 Maven,检查 pom.xml 中的依赖是否正确配置,并刷新项目。
    3. 如果你手动添加了 JAR,确保它在 CLASSPATH 中或在 IDE 的库路径里。

b. SQLException: The TCP/IP connection to the host has failed

  • 原因: Java 应用无法通过网络连接到 SQL Server 服务,这是最常见的问题。
  • 解决方案:
    1. 检查 SQL Server 服务: 确保你的 SQL Server 服务正在运行,在 Windows 上,可以通过 "服务" 应用查看 "SQL Server (MSSQLSERVER)" 是否已启动。
    2. 检查端口: 确认 SQL Server 监听的端口是否是 1433(默认),如果不是,请在连接字符串中修改端口号,jdbc:sqlserver://localhost:1434;...
    3. 检查 SQL Server 配置:
      • 打开 SQL Server Configuration Manager。
      • 展开 "SQL Server 网络配置" -> "SQLEXPRESS 的协议" (或你的实例名)。
      • 确保 TCP/IP 协议是 已启用 的。
      • 双击 TCP/IP,在 "IP 地址" 选项卡中,确保 "IPAll" 下的 "TCP 端口" 是 1433
    4. 检查防火墙: Windows 防火墙可能阻止了 1433 端口的入站连接,你可以暂时关闭防火墙进行测试,或者在防火墙规则中允许 1433 端口。

c. Login failed for user '...'

  • 原因: 用户名或密码错误,或者该用户没有权限访问数据库。
  • 解决方案:
    1. 核对凭证: 仔细检查连接字符串中的 USERPASS 是否完全正确。
    2. 检查用户: 在 SSMS 中,使用错误的用户名密码尝试登录,看是否能登录,如果不能,说明凭证确实错误。
    3. 检查权限: 确保该用户有访问 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 (目前性能最好的连接池)

  1. 添加依赖:

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>5.0.1</version>
    </dependency>
  2. 使用示例:

    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!

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