MySQL JDBC 编程指南

JDBC(Java Database Connectivity)是 Java 提供的一个数据库连接 API,用于实现 Java 程序和数据库之间的交互。通过 JDBC,Java 程序能够连接、查询、更新数据库中的数据。本篇将介绍如何通过 JDBC 编程连接 MySQL 数据库、执行 SQL 查询、更新数据,以及常见的异常处理等。

1. 配置 MySQL 和 JDBC 环境

首先,确保你已经安装了 MySQL 数据库并创建了一个数据库。我们假设你的数据库名为 test_db,并且已经有一个表 users,其结构如下:

CREATE DATABASE test_db;
USE test_db;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100)
);

接下来,确保你的项目中包含 MySQL JDBC 驱动。你可以通过 Maven 来引入 MySQL JDBC 驱动。

Maven 配置

在 pom.xml 中添加 MySQL JDBC 驱动依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version> <!-- 使用适当版本 -->
</dependency>

2. MySQL JDBC 连接基础

通过 JDBC 连接 MySQL 时,我们通常使用以下步骤:

  1. 加载 MySQL 驱动
  2. 建立连接
  3. 创建 Statement 或 PreparedStatement
  4. 执行 SQL 查询或更新
  5. 处理结果集
  6. 关闭连接

3. JDBC 编程基本步骤

3.1 加载 MySQL 驱动

MySQL JDBC 驱动类为 com.mysql.cj.jdbc.Driver,你可以通过 Class.forName() 来加载它:

Class.forName("com.mysql.cj.jdbc.Driver");

3.2 建立数据库连接

使用 DriverManager.getConnection() 来建立与 MySQL 数据库的连接。

// 数据库连接 URL 格式: jdbc:mysql://[主机名或IP地址]:[端口号]/[数据库名]
String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC";
String username = "root"; // 数据库用户名
String password = "password"; // 数据库密码

Connection conn = DriverManager.getConnection(url, username, password);

3.3 创建 Statement 或 PreparedStatement

  • Statement:用于执行简单的 SQL 查询。
  • PreparedStatement:用于执行预编译的 SQL 语句,适用于处理动态参数、提高性能。
Statement stmt = conn.createStatement();

或者:

String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1); // 设置 id 参数

3.4 执行查询或更新操作

执行查询操作(SELECT)时,使用 executeQuery() 方法,返回 ResultSet 对象:

String query = "SELECT * FROM users";
ResultSet rs = stmt.executeQuery(query);

对于更新操作(INSERTUPDATEDELETE),使用 executeUpdate() 方法:

String updateQuery = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(updateQuery);
pstmt.setString(1, "John Doe");
pstmt.setString(2, "john.doe@example.com");
int rowsAffected = pstmt.executeUpdate();

3.5 处理结果集

查询操作返回的结果集(ResultSet)可以通过 next() 方法逐行读取数据:

while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String email = rs.getString("email");

    System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}

3.6 关闭连接

在完成数据库操作后,记得关闭 ResultSetStatement 和 Connection 对象,以释放资源:

rs.close();
stmt.close();
conn.close();

4. 完整 JDBC 编程示例

以下是一个完整的 JDBC 编程示例,展示如何连接 MySQL 数据库、插入数据并查询所有记录。

import java.sql.*;

public class MySQLJDBCExample {
    public static void main(String[] args) {
        // JDBC URL 和连接信息
        String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "password";

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 加载 MySQL 驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 建立连接
            conn = DriverManager.getConnection(url, username, password);

            // 3. 创建 Statement 对象
            stmt = conn.createStatement();

            // 4. 执行插入操作
            String insertSQL = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')";
            stmt.executeUpdate(insertSQL);

            // 5. 执行查询操作
            String querySQL = "SELECT * FROM users";
            rs = stmt.executeQuery(querySQL);

            // 6. 处理查询结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");

                System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
            }

        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

5. 处理常见的异常

在 JDBC 编程中,常见的异常包括 SQLException,它表示数据库操作时出现的错误。可以通过 try-catch 捕获并处理这些异常。

try {
    // 数据库操作代码
} catch (SQLException e) {
    System.out.println("SQLException: " + e.getMessage());
    e.printStackTrace();
}

6. 使用 Connection Pool(连接池)

为了提高数据库连接的性能,尤其是在高并发应用中,使用数据库连接池是一个常见做法。常用的连接池库有 HikariCPApache DBCP 和 C3P0 等。

连接池可以有效地管理数据库连接的创建、复用和关闭,避免频繁创建新连接带来的性能问题。


7. 总结

在这篇文章中,我们通过一个简单的 MySQL JDBC 编程示例展示了如何通过 Java 连接 MySQL 数据库并执行常见的操作:

  • 加载 JDBC 驱动
  • 建立数据库连接
  • 执行 SQL 查询和更新
  • 处理查询结果
  • 关闭数据库资源

JDBC 是 Java 和数据库之间的桥梁,掌握 JDBC 编程对于进行数据库操作至关重要。如果你需要进一步了解 JDBC 高级特性(如事务管理、批量更新等),可以随时提问!