上一篇
Java连接MySQL需加载JDBC驱动,通过DriverManager获取Connection对象,创建Statement执行SQL语句,处理ResultSet结果集,最后关闭资源,常用try-with-resources确保连接释放。
在Java中使用MySQL进行数据库操作是开发中常见的需求,以下是详细步骤和最佳实践,确保代码安全高效:
环境准备
-
安装MySQL
- 从MySQL官网下载安装包
- 配置root用户密码,创建测试数据库(示例库名:
test_db)CREATE DATABASE test_db; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(50) UNIQUE );
-
Java项目配置

- JDK 8+(推荐JDK 11)
- 添加MySQL驱动依赖:
<!-- Maven方式 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 使用最新版本 --> </dependency>或手动下载JAR包导入项目
建立数据库连接
使用JDBC连接MySQL,务必使用try-with-resources自动关闭资源:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MySQLDemo {
// 数据库配置(实际项目应使用配置管理)
private static final String URL = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "your_username";
private static final String PASSWORD = "your_password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public static void main(String[] args) {
try (Connection conn = getConnection()) {
System.out.println("数据库连接成功!");
} catch (SQLException e) {
System.err.println("连接失败: " + e.getMessage());
}
}
}
注意:
- MySQL 8.0+ 需显式指定时区(如
serverTimezone=UTC)- 生产环境必须启用SSL(
useSSL=true)
执行SQL操作
插入数据(防SQL注入)
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "张三"); // 绑定第一个参数
pstmt.setString(2, "zhangsan@example.com");
int rows = pstmt.executeUpdate();
System.out.println("插入行数: " + rows);
} catch (SQLException e) {
e.printStackTrace();
}
查询数据
String sql = "SELECT id, name, email FROM users";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.printf("ID: %d, 姓名: %s, 邮箱: %s%n", id, name, email);
}
} catch (SQLException e) {
e.printStackTrace();
}
更新与删除
// 更新示例
String updateSql = "UPDATE users SET email = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateSql)) {
pstmt.setString(1, "new_email@example.com");
pstmt.setInt(2, 1);
pstmt.executeUpdate();
}
// 删除示例
String deleteSql = "DELETE FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(deleteSql)) {
pstmt.setInt(1, 1);
pstmt.executeUpdate();
}
高级实践
使用连接池(HikariCP示例)
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
HikariConfig config = new HikariConfig();
config.setJdbcUrl(URL);
config.setUsername(USER);
config.setPassword(PASSWORD);
config.addDataSourceProperty("connectionTimeout", "30000");
config.addDataSourceProperty("maximumPoolSize", "20");
try (HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection()) {
// 使用连接操作数据库
}
事务管理
try (Connection conn = getConnection()) {
conn.setAutoCommit(false); // 关闭自动提交
// 执行多个操作
updateAccount(conn, "user1", -100); // 扣款
updateAccount(conn, "user2", 100); // 收款
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
e.printStackTrace();
}
安全注意事项
- 永远使用PreparedStatement
避免拼接SQL字符串,防止SQL注入攻击 - 敏感信息加密
数据库密码应使用环境变量或配置中心管理 - 连接超时设置
配置连接池的connectionTimeout(建议30秒) - 错误日志脱敏
禁止在日志中输出完整SQL语句和参数
常见错误排查
| 错误信息 | 解决方案 |
|---|---|
No suitable driver found |
检查驱动JAR是否在类路径中 |
Access denied for user |
核对用户名/密码,检查主机访问权限 |
Communications link failure |
确认MySQL服务运行,防火墙开放端口 |
Too many connections |
增加连接池大小或优化连接复用 |
通过以上步骤,您已掌握Java操作MySQL的核心技能,实际项目中建议结合Spring Data JPA或MyBatis等ORM框架提升开发效率。
引用说明:
- MySQL官方文档:JDBC开发指南
- Oracle JDBC教程:使用JDBC处理SQL
- OWASP安全建议:SQL注入防护
- HikariCP配置参考:GitHub文档

