准备工作:环境配置
-
导入JDBC驱动
在项目中添加数据库驱动的依赖(以MySQL为例):<!-- Maven 依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
-
加载驱动类
初始化数据库驱动(Java 6+ 可省略此步骤,但显式声明更可靠):Class.forName("com.mysql.cj.jdbc.Driver");
执行SQL命令的完整流程
步骤1:建立数据库连接
String url = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "your_password"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 后续操作在此代码块内进行 } catch (SQLException e) { e.printStackTrace(); }
关键参数说明:
useSSL=false
:禁用SSL(生产环境应启用)。serverTimezone=UTC
:避免时区错误。
步骤2:执行SQL命令
根据操作类型选择不同接口:
-
执行查询(SELECT)
使用PreparedStatement
防止SQL注入:String sql = "SELECT * FROM users WHERE age > ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, 18); // 参数下标从1开始 ResultSet rs = pstmt.executeQuery(); while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println(name + ": " + age); } }
-
执行更新(INSERT/UPDATE/DELETE)
使用executeUpdate()
返回受影响行数:String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "Alice"); pstmt.setString(2, "alice@example.com"); int rowsAffected = pstmt.executeUpdate(); System.out.println("插入行数: " + rowsAffected); }
关键注意事项
-
资源释放
使用 try-with-resources(Java 7+)自动关闭Connection
,Statement
,ResultSet
,避免内存泄漏。 -
事务管理
确保数据一致性:try (Connection conn = DriverManager.getConnection(url, user, password)) { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个SQL操作... conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 }
-
SQL注入防御
必须使用PreparedStatement
替代字符串拼接:// 错误示例(存在注入风险): String unsafeSql = "SELECT * FROM users WHERE name='" + userInput + "'"; // 正确做法: String safeSql = "SELECT * FROM users WHERE name=?"; PreparedStatement pstmt = conn.prepareStatement(safeSql); pstmt.setString(1, userInput);
高级优化方案
-
连接池技术
使用 HikariCP 或 Druid 提升性能:HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); try (HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection()) { // 操作数据库 }
-
使用工具框架
简化代码(如Spring JDBC Template、MyBatis):// Spring JDBC示例 jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")) );
常见错误排查
- 驱动类未找到:检查依赖版本和JDBC URL格式。
- 连接超时:确认数据库IP/端口、防火墙设置。
- 时区错误:在URL中添加
serverTimezone=Asia/Shanghai
。 - 权限问题:检查数据库账号的访问权限。
Java执行数据库命令的核心流程为:加载驱动 → 建立连接 → 创建Statement → 执行SQL → 处理结果 → 释放资源,关键要点:
- 始终使用
PreparedStatement
防注入。 - 通过 try-with-resources 管理资源。
- 生产环境务必启用连接池和事务控制。
引用说明基于Oracle官方JDBC文档、MySQL Connector/J指南及《Effective Java》中资源管理的最佳实践,技术细节遵循Java SE 17规范和MySQL 8.0标准,确保权威性和时效性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6152.html