Java实现MySQL数据库连接与操作实战指南

在当今的软件开发领域,数据库连接与操作是每个开发者必须掌握的核心技能之一。Java作为一门广泛使用的编程语言,提供了多种方式来连接和操作数据库。其中,JDBC(Java Database Connectivity)是最常用的技术之一。本文将详细介绍如何使用JDBC连接MySQL 8.0数据库,并通过实际案例展示如何进行数据库操作。

一、准备工作

在开始之前,确保你已经安装了以下软件和库:

  1. Java开发环境:JDK 1.8或更高版本。
  2. MySQL数据库:MySQL 8.0或更高版本。
  3. MySQL-Connector-Java:MySQL官方提供的JDBC驱动程序。
1.1 下载和安装MySQL-Connector-Java
  1. 访问MySQL官网下载MySQL-Connector-Java。
  2. 解压下载的文件,得到mysql-connector-java-x.x.x.jar文件。
  3. 将该JAR文件添加到你的Java项目的类路径中。

二、配置数据库连接

要使用JDBC连接MySQL数据库,需要配置以下参数:

  • Drivercom.mysql.cj.jdbc.Driver
  • URLjdbc:mysql://localhost:3306/数据库名?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
  • Username:数据库用户名
  • Password:用户密码
2.1 示例代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "password";

    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        return DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    public static void main(String[] args) {
        try {
            Connection connection = getConnection();
            System.out.println("数据库连接成功!");
            connection.close();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

三、执行SQL语句

连接数据库后,可以通过StatementPreparedStatement执行SQL语句。

3.1 执行SELECT查询
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SelectExample {
    public static void main(String[] args) {
        String sql = "SELECT * FROM users";
        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement statement = connection.prepareStatement(sql);
             ResultSet resultSet = statement.executeQuery()) {
            while (resultSet.next()) {
                System.out.println("User ID: " + resultSet.getInt("id"));
                System.out.println("Username: " + resultSet.getString("username"));
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}
3.2 执行INSERT操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertExample {
    public static void main(String[] args) {
        String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement statement = connection.prepareStatement(sql)) {
            statement.setString(1, "newuser");
            statement.setString(2, "password123");
            int rowsAffected = statement.executeUpdate();
            System.out.println("插入成功,影响行数:" + rowsAffected);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}
3.3 执行UPDATE操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UpdateExample {
    public static void main(String[] args) {
        String sql = "UPDATE users SET password = ? WHERE username = ?";
        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement statement = connection.prepareStatement(sql)) {
            statement.setString(1, "newpassword");
            statement.setString(2, "newuser");
            int rowsAffected = statement.executeUpdate();
            System.out.println("更新成功,影响行数:" + rowsAffected);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}
3.4 执行DELETE操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeleteExample {
    public static void main(String[] args) {
        String sql = "DELETE FROM users WHERE username = ?";
        try (Connection connection = DatabaseConnection.getConnection();
             PreparedStatement statement = connection.prepareStatement(sql)) {
            statement.setString(1, "newuser");
            int rowsAffected = statement.executeUpdate();
            System.out.println("删除成功,影响行数:" + rowsAffected);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

四、使用连接池

在实际生产环境中,频繁地创建和关闭数据库连接会严重影响性能。使用连接池可以有效地管理数据库连接,提高应用性能。

4.1 使用C3P0连接池
  1. 添加C3P0依赖到项目中。
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>
  1. 配置C3P0连接池。
import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0ConnectionPool {
    private static DataSource dataSource;

    static {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setPassword("password");

        comboPooledDataSource.setInitialPoolSize(5);
        comboPooledDataSource.setMaxPoolSize(20);
        comboPooledDataSource.setMinPoolSize(5);
        comboPooledDataSource.setAcquireIncrement(5);

        dataSource = comboPooledDataSource;
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
  1. 使用C3P0连接池获取连接。
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Example {
    public static void main(String[] args) {
        try (Connection connection = C3P0ConnectionPool.getConnection()) {
            System.out.println("使用C3P0连接池获取连接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
4.2 使用HikariCP连接池
  1. 添加HikariCP依赖到项目中。
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>
  1. 配置HikariCP连接池。
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class HikariCPConnectionPool {
    private static DataSource dataSource;

    static {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
        config.setUsername("root");
        config.setPassword("password");

        config.setMinimumIdle(5);
        config.setMaximumPoolSize(20);
        config.setIdleTimeout(30000);
        config.setConnectionTimeout(30000);
        config.setMaxLifetime(1800000);

        dataSource = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
  1. 使用HikariCP连接池获取连接。
import java.sql.Connection;
import java.sql.SQLException;

public class HikariCPExample {
    public static void main(String[] args) {
        try (Connection connection = HikariCPConnectionPool.getConnection()) {
            System.out.println("使用HikariCP连接池获取连接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

五、注意事项

  1. 确保MySQL服务运行:在连接数据库前,确保MySQL服务已启动。
  2. 密码安全性:在生产环境中,避免硬编码数据库密码,可以使用加密或配置文件管理。
  3. 异常处理:合理处理数据库连接和操作中可能出现的异常,确保程序的健壮性。

六、总结

通过本文的详细讲解,你已经掌握了如何使用Java和JDBC连接MySQL 8.0数据库,并执行常见的SQL操作。此外,还介绍了如何使用C3P0和HikariCP连接池来优化数据库连接管理。希望这些知识能帮助你在实际项目中高效地处理数据库操作。

如果你有任何问题或需要进一步的帮助,请随时联系我。祝你编程愉快!