Java实现MySQL数据库连接与操作实战指南
在当今的软件开发领域,数据库连接与操作是每个开发者必须掌握的核心技能之一。Java作为一门广泛使用的编程语言,提供了多种方式来连接和操作数据库。其中,JDBC(Java Database Connectivity)是最常用的技术之一。本文将详细介绍如何使用JDBC连接MySQL 8.0数据库,并通过实际案例展示如何进行数据库操作。
一、准备工作
在开始之前,确保你已经安装了以下软件和库:
- Java开发环境:JDK 1.8或更高版本。
- MySQL数据库:MySQL 8.0或更高版本。
- MySQL-Connector-Java:MySQL官方提供的JDBC驱动程序。
1.1 下载和安装MySQL-Connector-Java
- 访问MySQL官网下载MySQL-Connector-Java。
- 解压下载的文件,得到
mysql-connector-java-x.x.x.jar
文件。 - 将该JAR文件添加到你的Java项目的类路径中。
二、配置数据库连接
要使用JDBC连接MySQL数据库,需要配置以下参数:
- Driver:
com.mysql.cj.jdbc.Driver
- URL:
jdbc: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语句
连接数据库后,可以通过Statement
或PreparedStatement
执行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连接池
- 添加C3P0依赖到项目中。
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
- 配置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();
}
}
- 使用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连接池
- 添加HikariCP依赖到项目中。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
- 配置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();
}
}
- 使用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();
}
}
}
五、注意事项
- 确保MySQL服务运行:在连接数据库前,确保MySQL服务已启动。
- 密码安全性:在生产环境中,避免硬编码数据库密码,可以使用加密或配置文件管理。
- 异常处理:合理处理数据库连接和操作中可能出现的异常,确保程序的健壮性。
六、总结
通过本文的详细讲解,你已经掌握了如何使用Java和JDBC连接MySQL 8.0数据库,并执行常见的SQL操作。此外,还介绍了如何使用C3P0和HikariCP连接池来优化数据库连接管理。希望这些知识能帮助你在实际项目中高效地处理数据库操作。
如果你有任何问题或需要进一步的帮助,请随时联系我。祝你编程愉快!