mysql菜鸟教程

专栏导航

18.2 使用Java连接MySQL:JDBC

       在Java世界中,连接数据库的标准技术是 JDBC(Java Database Connectivity)。JDBC提供了一套统一的API,让Java程序能够与各种关系型数据库(如MySQL、Oracle、SQL Server等)进行交互。无论底层数据库是什么,开发者都可以用相似的代码来执行SQL语句、处理结果。

本节将带你从零开始,学习如何使用JDBC连接MySQL数据库,并完成常见的增删改查操作。

1. 准备工作:获取MySQL JDBC驱动

JDBC本身是一套接口,具体与MySQL通信的实现需要由MySQL官方提供的驱动来完成,这个驱动通常是一个JAR文件,名为 MySQL Connector/J

1.1 下载驱动JAR

1.2 在项目中添加依赖

如果你使用Maven,可以直接在 pom.xml 中添加依赖(推荐,无需手动下载):


<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version> <!-- 请使用最新稳定版 -->
</dependency>

如果你不使用Maven,则需要手动将下载的JAR文件添加到项目的classpath中:

  • 在IDE(如Eclipse、IntelliJ IDEA)中,将JAR包添加到项目的库中。

  • 如果是在命令行编译,需要设置 CLASSPATH 或使用 -cp 参数。

2. JDBC核心步骤

使用JDBC操作数据库通常遵循以下五个步骤:

  1. 注册驱动(可选,新版本可自动注册)

  2. 建立连接(通过 DriverManager

  3. 创建语句对象Statement 或 PreparedStatement

  4. 执行SQL 并处理结果

  5. 释放资源(关闭连接等)

2.1 注册驱动

在JDBC 4.0之后,只要驱动JAR在classpath中,驱动会自动注册,通常无需显式调用 Class.forName。但为了兼容旧代码,有时仍可见到如下写法:

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

现在这一行可以省略。

2.2 建立连接

使用 DriverManager.getConnection() 方法,传入数据库URL、用户名和密码。

JDBC URL格式

jdbc:mysql://主机:端口/数据库名?参数1=值1&参数2=值2

  • 主机:默认为 localhost

  • 端口:默认为 3306

  • 常用参数:

    • useSSL=false 或 true:是否使用SSL

    • serverTimezone=Asia/Shanghai:指定服务器时区(MySQL 8.0 要求显式设置时区)

    • characterEncoding=utf8:字符编码

示例:


String url = "jdbc:mysql://localhost:3306/your_database?"+
"useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8";
String user = "root";
String password = "your_password";

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

2.3 创建语句对象

有三种语句对象:

  • Statement:用于执行静态SQL语句。

  • PreparedStatement:预编译的SQL语句,可以防止SQL注入,推荐使用

  • CallableStatement:用于调用存储过程。

2.4 执行SQL

  • 执行查询(SELECT)使用 executeQuery(),返回 ResultSet 结果集。

  • 执行更新(INSERTUPDATEDELETE)使用 executeUpdate(),返回受影响的行数。

2.5 处理结果

对于查询,遍历 ResultSet 获取数据:


while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    // ...
}

2.6 释放资源

为了节省数据库连接资源,务必在finally块中关闭 ResultSetStatement 和 Connection。Java 7 引入了 try-with-resources 语法,可以自动关闭实现了 AutoCloseable 的资源,使代码更简洁。

3. 完整示例代码

下面我们通过一个完整的示例,展示如何使用JDBC实现用户表的增删改查操作。

3.1 数据库准备

首先,在MySQL中创建一个数据库 testdb 和一张表 users


CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4;
USE testdb;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    age INT
);

3.2 Java代码示例


import java.sql.*;

public class JdbcDemo {

    // 数据库连接配置
    private static final String URL = "jdbc:mysql://localhost:3306/testdb?"+
"useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8";
    private static final String USER = "root";
    private static final String PASSWORD = "your_password";

    public static void main(String[] args) {
        // 测试插入
        insertUser("张三", "zhangsan@example.com", 25);
        // 测试查询
        selectAllUsers();
        // 测试更新
        updateUserEmail("zhangsan@example.com", "newemail@example.com");
        // 测试删除
        deleteUserByEmail("lisi@example.com");
    }

    /**
     * 插入用户(使用 PreparedStatement 防止SQL注入)
     */
    public static void insertUser(String name, String email, int age) {
        String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
        // try-with-resources 自动关闭连接、语句
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, name);
            pstmt.setString(2, email);
            pstmt.setInt(3, age);

            int rows = pstmt.executeUpdate();
            System.out.println("插入了 " + rows + " 行数据。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询所有用户
     */
    public static void selectAllUsers() {
        String sql = "SELECT id, name, email, age FROM users";
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            System.out.println("用户列表:");
            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("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d%n", 
                id, name, email, age);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据原邮箱更新用户邮箱
     */
    public static void updateUserEmail(String oldEmail, String newEmail) {
        String sql = "UPDATE users SET email = ? WHERE email = ?";
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, newEmail);
            pstmt.setString(2, oldEmail);

            int rows = pstmt.executeUpdate();
            System.out.println("更新了 " + rows + " 行数据。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据邮箱删除用户
     */
    public static void deleteUserByEmail(String email) {
        String sql = "DELETE FROM users WHERE email = ?";
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, email);

            int rows = pstmt.executeUpdate();
            System.out.println("删除了 " + rows + " 行数据。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4. 重要注意事项

  1. 使用PreparedStatement防止SQL注入绝对不要通过字符串拼接来构造SQL语句,尤其是包含用户输入的部分。使用 PreparedStatement 的参数化查询是唯一安全的方式。

  2. 处理时区问题MySQL 8.0 要求显式设置时区,否则可能报错。在URL中添加 serverTimezone=Asia/Shanghai(或其他时区)。

  3. 资源释放数据库连接是宝贵资源,用完必须关闭。推荐使用 try-with-resources 自动关闭,或手动在finally中关闭。

  4. 事务管理默认情况下,每条SQL语句执行后会自动提交。如果希望将多条语句作为一个事务,可以调用 conn.setAutoCommit(false),然后手动 commit() 或 rollback()

  5. 处理异常JDBC操作会抛出 SQLException,需要捕获或向上抛出。注意异常信息中可能包含详细的数据库错误。

  6. 驱动版本MySQL 5.x 和 8.x 使用的驱动略有不同。MySQL 8.x 建议使用 com.mysql.cj.jdbc.Driver,URL中需要指定时区。

5. 总结

  • JDBC 是Java连接数据库的标准方式,MySQL提供了对应的驱动 mysql-connector-java

  • 核心步骤:加载驱动(可省略)、建立连接、创建语句、执行SQL、处理结果、释放资源。

  • PreparedStatement 是执行参数化查询的首选,可防止SQL注入。

  • 使用 try-with-resources 自动管理资源,让代码更简洁健壮。

  • 务必注意时区、事务提交等细节。

掌握了JDBC,你就可以在Java程序中自由地操作MySQL数据库,为开发Web应用、桌面软件等奠定基础。下一节我们将学习如何使用PHP连接MySQL。


所有评论

关于我 备案号:蜀ICP备2023042032号-1