Java与SQL数据库的连接是开发企业级应用的核心技术之一,通过JDBC(Java Database Connectivity)API实现,以下是详细步骤和最佳实践,遵循安全、高效原则:
连接前的准备工作
-
环境依赖
- Java开发环境:JDK 8+(Oracle JDK 或 OpenJDK)
- 数据库:MySQL/Oracle/SQL Server等(以MySQL 8.0为例)
- 驱动包:下载对应数据库的JDBC驱动(MySQL Connector/J)
-
项目配置
- Maven项目添加依赖:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
- Maven项目添加依赖:
连接数据库的6个关键步骤
import java.sql.*; public class JdbcExample { // 数据库配置(实际项目应使用配置管理) private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "securePassword123"; public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 1. 加载驱动 (JDBC 4.0+ 自动加载,可省略) Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); // 3. 创建PreparedStatement(防SQL注入) String sql = "SELECT * FROM users WHERE age > ?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 18); // 参数下标从1开始 // 4. 执行查询 rs = pstmt.executeQuery(); // 5. 处理结果集 while (rs.next()) { System.out.println( "ID: " + rs.getInt("id") + ", Name: " + rs.getString("name") ); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { // 6. 关闭连接(必须执行) try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
安全与性能最佳实践
-
防SQL注入
- 必须使用
PreparedStatement
替代Statement
- 示例错误写法:
"SELECT * FROM users WHERE name='" + userInput + "'"
- 必须使用
-
连接池管理
- 推荐使用HikariCP或Druid:
HikariConfig config = new HikariConfig(); config.setJdbcUrl(URL); config.setUsername(USER); config.setPassword(PASSWORD); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); // 从连接池获取
- 推荐使用HikariCP或Druid:
-
资源关闭规范
- 使用try-with-resources(Java 7+)自动关闭:
try (Connection conn = DriverManager.getConnection(URL); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 操作代码 } // 自动调用close()
- 使用try-with-resources(Java 7+)自动关闭:
-
异常处理
- 捕获特定异常:
catch (SQLException e) { System.err.println("数据库错误: " + e.getErrorCode()); }
- 捕获特定异常:
常见问题排查
错误现象 | 解决方案 |
---|---|
No suitable driver |
检查URL格式(jdbc:mysql://) |
Access denied |
验证用户名/密码及IP权限 |
SSL not enabled |
URL添加?useSSL=true |
时区错误 | 添加&serverTimezone=Asia/Shanghai |
关键提示:生产环境必须启用SSL加密连接,避免敏感数据泄露,定期更新JDBC驱动修复安全漏洞。
扩展应用场景
-
事务管理
conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多个SQL conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚 }
-
批量处理
pstmt = conn.prepareStatement("INSERT INTO logs VALUES (?)"); for (String log : logs) { pstmt.setString(1, log); pstmt.addBatch(); // 加入批处理 } int[] counts = pstmt.executeBatch(); // 执行批处理
引用说明: 基于Oracle官方JDBC教程[1]、MySQL Connector/J文档[2]及OWASP SQL注入防护指南[3]编写,遵循Java编码安全规范,连接池配置参考HikariCP最佳实践[4]。
参考资料:
[1] Oracle JDBC Documentation
[2] MySQL Connector/J Developer Guide
[3] OWASP SQL Injection Prevention
[4] HikariCP Configuration
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46121.html