上一篇
Java通过JDBC API连接SQL数据库,需加载驱动、建立Connection连接,创建Statement执行SQL语句,处理ResultSet结果集,最后关闭资源确保安全。
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
