在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文档
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/34701.html