杰瑞科技汇

Java连接MySQL驱动时如何正确配置?

  1. 准备驱动:下载并添加MySQL的JDBC驱动。
  2. 加载驱动:在Java代码中加载驱动类。
  3. 建立连接:使用DriverManager获取数据库连接对象。
  4. 创建执行对象:通过连接对象创建StatementPreparedStatement来执行SQL。
  5. 执行SQL:执行查询或更新操作。
  6. 处理结果:如果是查询,处理返回的ResultSet结果集。
  7. 关闭资源:按照后进先出的原则,关闭所有打开的资源(ResultSet, Statement, Connection)。

第一步:准备MySQL JDBC驱动

你需要下载MySQL官方提供的Java驱动库,也就是JAR包。

Java连接MySQL驱动时如何正确配置?-图1
(图片来源网络,侵删)
  1. 下载地址

    • 访问 MySQL Connector/J 下载页面
    • 选择 "Platform Independent" (平台独立) 版本,下载一个ZIP压缩包。
    • 或者,如果你使用Maven或Gradle,可以直接在项目中添加依赖,无需手动下载。
  2. 添加到项目

    • 对于普通Java项目:将下载的ZIP包解压,找到 mysql-connector-j-版本号.jar 文件,在你的IDE(如Eclipse, IntelliJ IDEA)中,将这个JAR文件添加到项目的 "External Libraries" 或 "Libraries" 中。
    • 对于Maven项目:在 pom.xml 文件中添加以下依赖,Maven会自动帮你下载和管理。
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.33</version> <!-- 建议使用最新稳定版 -->
    </dependency>
    • 对于Gradle项目:在 build.gradle 文件中添加以下依赖。
    implementation 'com.mysql:mysql-connector-j:8.0.33' // 建议使用最新稳定版

第二步:编写Java代码连接数据库

下面是一个完整的、详细的Java代码示例,展示了如何连接MySQL数据库并执行一个简单的查询。

核心代码示例

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 MySQLJdbcExample {
    // 数据库连接信息
    // 注意:如果MySQL 8.0+,驱动类名和URL略有不同
    private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC";
    private static final String USER = "your_username";
    private static final String PASS = "your_password";
    public static void main(String[] args) {
        // 1. 定义资源变量,并在finally块中关闭
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 2. 加载JDBC驱动 (对于新版驱动,这步通常是可选的,但写上更稳妥)
            // Class.forName("com.mysql.cj.jdbc.Driver");
            // 3. 获取数据库连接
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("Connection successful!");
            // 4. 创建执行SQL语句的Statement对象
            // 推荐使用PreparedStatement来防止SQL注入
            String sql = "SELECT id, name, email FROM users WHERE id = ?";
            stmt = conn.prepareStatement(sql);
            // 设置参数
            stmt.setInt(1, 1); // 假设我们要查询id为1的用户
            // 5. 执行查询,获取结果集
            System.out.println("Executing query: " + sql);
            rs = stmt.executeQuery();
            // 6. 处理结果集
            while (rs.next()) {
                // 通过列名获取数据,更具可读性且不易出错
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                // 打印输出
                System.out.print("ID: " + id);
                System.out.print(", Name: " + name);
                System.out.println(", Email: " + email);
            }
        } catch (SQLException e) {
            // 捕获并处理SQL异常
            e.printStackTrace();
        } finally {
            // 7. 关闭资源 (非常重要!)
            // 关闭顺序:ResultSet -> Statement -> Connection
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
                System.out.println("Database resources closed.");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

重要细节和说明

驱动类名和URL的差异 (MySQL 5.x vs 8.x)

这是最容易出错的地方。请根据你的MySQL版本选择正确的配置

Java连接MySQL驱动时如何正确配置?-图2
(图片来源网络,侵删)
特性 MySQL 5.x MySQL 8.0+
驱动类名 com.mysql.jdbc.Driver com.mysql.cj.jdbc.Driver
URL格式 jdbc:mysql://host:port/db_name jdbc:mysql://host:port/db_name?...
SSL 可选 强烈建议使用,需在URL中显式禁用 useSSL=false
时区 无需特殊处理 必须指定时区,否则会报错 serverTimezone=UTC

示例URL:

  • MySQL 5.x:

    String DB_URL = "jdbc:mysql://localhost:3306/your_database_name";
  • MySQL 8.0+:

    String DB_URL = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC";
    // 如果你的数据库在远程,可能需要添加 allowPublicKeyRetrieval=true
    // String DB_URL = "jdbc:mysql://remote_host:3306/your_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";

Statement vs PreparedStatement

  • Statement:用于执行静态的SQL语句,如果SQL语句中包含变量,需要手动拼接字符串,非常容易导致SQL注入攻击,不推荐使用。

    Java连接MySQL驱动时如何正确配置?-图3
    (图片来源网络,侵删)
    // 不推荐的方式
    String sql = "SELECT * FROM users WHERE name = '" + userName + "'";
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
  • PreparedStatement:预编译SQL语句,它使用 作为占位符,然后通过 setXxx() 方法来设置参数,这种方式更安全、高效,并且能防止SQL注入。强烈推荐使用PreparedStatement

关闭资源的重要性

数据库连接(Connection)、语句对象(Statement/PreparedStatement)和结果集(ResultSet)都是数据库资源,非常宝贵,如果不关闭,会导致数据库连接泄漏,最终可能耗尽数据库的连接池,导致整个应用程序无法工作。

finally 块确保无论是否发生异常,资源都会被尝试关闭,这是Java编程中的一个良好实践。

使用连接池 (Connection Pool)

在真实的应用程序中,频繁地创建和关闭连接是非常低效的,通常会使用连接池来管理数据库连接。

连接池在应用程序启动时创建一组数据库连接,当需要连接时从池中获取,使用完毕后归还给池中,而不是关闭。

流行的连接池库:

  • HikariCP:目前性能最好、最流行的连接池。
  • Apache DBCP
  • C3P0

使用HikariCP的简单示例:

  1. 添加Maven依赖:

    <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.SQLException;
    import java.sql.Statement;
    public class HikariExample {
        private static HikariDataSource dataSource;
        static {
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC");
            config.setUsername("your_username");
            config.setPassword("your_password");
            config.setDriverClassName("com.mysql.cj.jdbc.Driver");
分享:
扫描分享到社交APP
上一篇
下一篇