杰瑞科技汇

java调用sqlserver

Java 应用程序通过 JDBC (Java Database Connectivity) API 来连接和操作数据库,JDBC 是 Java 标准的一部分,它定义了一组接口和类,允许 Java 程序执行 SQL 语句。

整个过程可以分为以下几个核心步骤:

  1. 准备环境:安装 SQL Server 数据库和 Java 开发环境。
  2. 获取 JDBC 驱动:下载 SQL Server 的 JDBC 驱动程序(JAR 包)。
  3. 配置项目:将 JDBC 驱动 JAR 包添加到你的 Java 项目中。
  4. 编写 Java 代码:使用 JDBC API 加载驱动、建立连接、执行 SQL、处理结果、关闭资源。

第一步:环境准备

  1. SQL Server 数据库

    • 确保你有一台可访问的 SQL Server 实例(可以是本地安装的,也可以是远程服务器)。
    • 知道你的服务器地址(localhost 或 IP 地址)、端口号(默认为 1433)、数据库名称。
    • 拥有一个有效的用户名和密码。
  2. Java 开发环境

    • 安装 JDK (Java Development Kit)。
    • 安装一个 IDE(如 IntelliJ IDEA, Eclipse, VS Code)。

第二步:获取 JDBC 驱动

你需要下载 Microsoft 提供的官方 JDBC 驱动,这个驱动是连接 Java 和 SQL Server 的桥梁。

  1. 下载地址

    • 官方下载页面:Microsoft JDBC Drivers for SQL Server
    • 你可以根据你的 JDK 版本选择合适的驱动,一个较新的驱动(如 11.2.x)可以兼容多个 JDK 版本。
  2. 下载文件

    • 下载后会得到一个 .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 为例)

  1. 打开你的项目。
  2. 找到项目结构(File -> Project Structure...File -> Project Structure...)。
  3. 选择 Modules -> Dependencies 选项卡。
  4. 点击 号,选择 JARs or directories...
  5. 浏览并选择你刚刚下载的 JDBC 驱动 JAR 文件(mssql-jdbc-11.2.1.jre11.jar)。
  6. 点击 OK,确保 Scope 设置为 CompileRuntime

在 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 文件没有被正确地添加到项目的类路径中。

解决方案

  1. 确认你已下载了正确的 JDBC 驱动 JAR 文件。
  2. 确认你已将该 JAR 文件添加到了 IDE 的库/依赖项中,或者 Maven/Gradle 的依赖列表中。
  3. 如果你使用命令行编译和运行,请确保在 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 failedLogin failed for user 'sa'

原因

  • SQL Server 服务未启动。
  • 防火墙阻止了 1433 端口。
  • 服务器地址、端口号、用户名或密码错误。
  • SQL Server 的身份验证模式设置为“Windows 身份验证”,但你尝试使用 SQL Server 身份验证(用户名/密码),你需要将 SQL Server 混合模式认证,或者使用 integratedSecurity=true

解决方案

  1. 检查 SQL Server 服务是否正在运行。
  2. 检查 Windows 防火墙或云服务商的安全组,确保 1433 端口已开放。
  3. 仔细核对连接字符串中的所有信息。
  4. 在 SQL Server Management Studio (SSMS) 中,使用相同的凭据尝试登录,以验证凭据是否正确。

步骤 关键点
环境准备 确保 SQL Server 和 JDK 已安装并可用。
获取驱动 从微软官网下载 JDBC 驱动 JAR 文件。
配置项目 推荐使用 Maven,手动将 JAR 添加到项目类路径。
编写代码 使用 try-with-resources 自动关闭资源。优先使用 PreparedStatement 防止 SQL 注入。
连接字符串 格式要正确,注意 encrypttrustServerCertificate 等属性。
错误处理 ClassNotFoundException 检查类路径;SQLException 检查网络、认证和 SQL 语法。

遵循以上指南,你就可以成功地在 Java 应用程序中连接和操作 SQL Server 数据库了。

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