杰瑞科技汇

Java如何导入MySQL数据库?

核心概念

Java 通过 JDBC (Java Database Connectivity) API 来与各种数据库(包括 MySQL)进行交互,JDBC 是 Java 的一套标准,它定义了一组接口和类,让 Java 程序能够执行 SQL 语句并处理结果。

Java如何导入MySQL数据库?-图1
(图片来源网络,侵删)

要连接 MySQL 数据库,你需要两样东西:

  1. JDBC 驱动程序:这是 MySQL 官方提供的、实现了 JDBC 接口的库,Java 程序通过它才能“说”懂 MySQL 的语言。
  2. Java 代码:使用 JDBC API 来加载驱动、建立连接、创建语句、执行查询和处理结果。

第一步:准备工作

安装 MySQL 数据库

确保你的计算机上已经安装并运行了 MySQL 数据库,你可以从 MySQL 官网 下载并安装。

创建数据库和表

为了演示,我们先在 MySQL 中创建一个简单的数据库和一张表。

-- 登录到你的 MySQL 服务器
-- mysql -u root -p
-- 创建一个名为 'java_test' 的数据库
CREATE DATABASE java_test;
-- 使用这个数据库
USE java_test;
-- 创建一张名为 'users' 的表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    age INT
);
-- 插入一些测试数据
INSERT INTO users (name, email, age) VALUES
('Alice', 'alice@example.com', 28),
('Bob', 'bob@example.com', 32),
('Charlie', 'charlie@example.com', 24);

下载 MySQL JDBC 驱动

这是最关键的一步,你需要下载 MySQL Connector/J,也就是 JDBC 驱动。

Java如何导入MySQL数据库?-图2
(图片来源网络,侵删)
  1. 访问 MySQL Connector/J 下载页面
  2. 选择平台无关的版本(Platform Independent)。
  3. 下载 .zip.tar.gz 压缩包。
  4. 解压后,你会得到一个 mysql-connector-j-x.x.x.jar 文件(x.x.x 是版本号),这个 JAR 文件就是我们需要的驱动。

第二步:在项目中配置 JDBC 驱动

你有两种主要方式将这个 JAR 文件添加到你的 Java 项目中:

IDE(如 IntelliJ IDEA 或 Eclipse)中手动添加

这是最简单直接的方式,适合初学者和单个项目。

  1. 在 IntelliJ IDEA 中:

    • 打开你的项目。
    • 在左侧的文件浏览器中,右键点击你的项目名称(或 src 文件夹)。
    • 选择 Open Module Settings (或按 F4)。
    • 在弹出的窗口中,选择 Libraries
    • 点击 号,选择 Java
    • 找到并选择你刚刚下载的 mysql-connector-j-x.x.x.jar 文件。
    • 点击 OK,IDE 会自动将其添加到项目的 Classpath 中。
  2. 在 Eclipse 中:

    Java如何导入MySQL数据库?-图3
    (图片来源网络,侵删)
    • 右键点击你的项目,选择 Build Path -> Configure Build Path
    • Libraries 标签页下,点击 Add External JARs...
    • 找到并选择 mysql-connector-j-x.x.x.jar 文件。
    • 点击 Apply and Close

使用 Maven(推荐用于大型项目)

如果你的项目使用 Maven 构建管理,你只需要在 pom.xml 文件中添加依赖即可,Maven 会自动帮你下载。

打开你的 pom.xml 文件,在 <dependencies> 标签内添加以下内容:

<dependencies>
    <!-- 其他依赖... -->
    <!-- MySQL Connector/J 驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.33</version> <!-- 建议使用最新稳定版 -->
    </dependency>
</dependencies>

第三步:编写 Java 连接代码

下面是一个完整的 Java 示例,演示了如何连接到 MySQL 数据库,并执行查询操作。

数据库连接信息:

  • 主机: localhost (如果你的 MySQL 在本机运行)
  • 端口: 3306 (MySQL 默认端口)
  • 数据库名: java_test
  • 用户名: root
  • 密码: 你的 MySQL 密码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlJdbcExample {
    // --- 数据库连接信息 ---
    // 注意:如果使用较新版本的驱动,URL中的 "com.mysql.cj.jdbc.Driver" 是推荐的
    private static final String DB_URL = "jdbc:mysql://localhost:3306/java_test?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASS = "你的密码"; // 请替换成你自己的密码
    public static void main(String[] args) {
        // try-with-resources 语句可以自动关闭资源,是 Java 7+ 的最佳实践
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT id, name, email, age FROM users")) {
            // 1. 加载驱动 (对于较新版本的 JDBC 驱动,这步通常是可选的,但写上更明确)
            // Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("成功连接到数据库!");
            // 2. 执行查询
            System.out.println("ID\tName\t\tEmail\t\tAge");
            System.out.println("-------------------------------------------");
            // 3. 遍历结果集
            while (rs.next()) {
                // 通过列名获取数据,更健壮,不易因列顺序改变而出错
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                int age = rs.getInt("age");
                // 输出结果
                System.out.printf("%d\t%-15s\t%-20s\t%d\n", id, name, email, age);
            }
        } catch (SQLException e) {
            // 捕获并处理 SQL 异常
            System.err.println("数据库连接或查询出错!");
            e.printStackTrace();
        }
    }
}

代码解析

  1. DB_URL: 数据库的统一资源定位符。

    • jdbc:mysql://: 协议和子协议,表示使用 JDBC 连接到 MySQL。
    • localhost:3306: 数据库服务器地址和端口。
    • /java_test: 要连接的数据库。
    • ?useSSL=false&serverTimezone=UTC: URL 参数。
      • useSSL=false: 在本地开发时禁用 SSL,避免警告,生产环境应配置正确的 SSL。
      • serverTimezone=UTC: 指定服务器时区,避免时区警告。
  2. DriverManager.getConnection(url, user, password): 这是建立连接的核心方法,它尝试使用提供的 URL、用户名和密码连接到数据库。

  3. try-with-resources: 语法 (Connection conn = ...; Statement stmt = ...; ResultSet rs = ...)

    • 这个语法会确保 conn, stmt, rs 在代码块执行完毕后自动被关闭,即使发生异常也是如此,这极大地避免了资源泄漏,是现代 Java 编程的推荐做法。
  4. conn.createStatement(): 创建一个 Statement 对象,用于执行静态 SQL 语句。

  5. stmt.executeQuery("..."): 执行一个查询(SELECT)语句,并返回一个 ResultSet 对象,该对象包含了查询结果。

  6. while (rs.next()): ResultSet 的游标最初位于第一行 之前rs.next() 方法将游标移动到下一行,如果存在下一行则返回 true,否则返回 false,我们用它来遍历所有结果行。

  7. rs.getXXX("columnName"): 从当前行中获取指定列的数据。

    • getInt("id"): 获取名为 "id" 的列的值,并转换为 int 类型。
    • getString("name"): 获取名为 "name" 的列的值,并转换为 String 类型。
  8. catch (SQLException e): 如果连接或执行 SQL 过程中发生任何错误(如密码错误、表不存在等),会抛出 SQLException,我们在这里捕获并打印错误信息。

常见问题

  • java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

    • 原因: JDBC 驱动 JAR 文件没有被正确添加到项目的 Classpath 中。
    • 解决: 回到第二步,确保你已将 mysql-connector-j-x.x.x.jar 文件添加到你的项目中。
  • java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    • 原因: 用户名或密码错误,或者该用户没有连接到指定数据库的权限。
    • 解决: 检查你的 USERPASS 变量是否正确,你可以尝试在 MySQL 命令行中用相同的凭据登录来验证。
  • java.sql.SQLException: The server time zone value '�йʱ��' is unrecognized or represents more than one time zone.

    • 原因: 服务器和客户端的时区不一致。
    • 解决: 在数据库 URL 中添加时区参数,如 ?serverTimezone=UTC?serverTimezone=Asia/Shanghai
  • java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/java_test

    • 原因: JDBC 驱动没有被加载。
    • 解决: 确保你的 JDBC 驱动版本较新(8.x),或者手动加载驱动 Class.forName("com.mysql.cj.jdbc.Driver");,在现代驱动中,这通常不是必需的,但可以作为一个排查步骤。

进阶:使用 PreparedStatement 防止 SQL 注入

上面的例子使用了 Statement,它不适合处理用户输入,因为容易受到 SQL 注入攻击,在实际开发中,你应该优先使用 PreparedStatement

// 示例:使用 PreparedStatement 查询特定年龄的用户
String sql = "SELECT name, email FROM users WHERE age > ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    // 设置参数(索引从 1 开始)
    pstmt.setInt(1, 25); // 查询年龄大于 25 的用户
    // 执行查询
    try (ResultSet rs = pstmt.executeQuery()) {
        System.out.println("Name\tEmail");
        System.out.println("----------------------");
        while (rs.next()) {
            System.out.println(rs.getString("name") + "\t" + rs.getString("email"));
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

PreparedStatement 会将 SQL 语句和参数分开处理,从而有效防止 SQL 注入,并且通常性能更好,因为它可以被数据库预编译和缓存。

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