JDBC如何连接数据库?
- 数据库
- 2025-07-04
- 2896
使用JDBC连接数据库需加载驱动,调用DriverManager.getConnection()传入数据库URL、用户名和密码,建立连接后通过Statement执行SQL操作,最后关闭连接释放资源。
什么是JDBC?
JDBC(Java Database Connectivity)是Java语言中用于连接和操作数据库的标准API,它允许开发者通过统一的接口访问多种关系型数据库(如MySQL、Oracle、PostgreSQL等),无需针对不同数据库编写独立代码,JDBC的核心作用是建立Java应用程序与数据库之间的桥梁,实现数据的增删改查(CRUD)操作。
JDBC连接数据库的6个核心步骤
以下以连接MySQL 8.0+为例,其他数据库只需替换驱动和连接字符串。
导入JDBC驱动
在项目中添加数据库驱动的依赖:
- Maven项目(
pom.xml
):<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
- 手动导入:
从MySQL官网下载JAR包并添加到项目路径。
加载数据库驱动
使用Class.forName()
显式加载驱动类(MySQL 8.0+需指定新驱动名):
Class.forName("com.mysql.cj.jdbc.Driver");
建立数据库连接
通过DriverManager.getConnection()
获取连接对象,需提供:
- 数据库URL:
jdbc:mysql://主机名:端口/数据库名?参数
- 用户名与密码
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "your_password";
Connection connection = DriverManager.getConnection(url, user, password);
> **关键参数说明**:
> - `useSSL=false`:禁用SSL(生产环境应启用)
> - `serverTimezone=UTC`:统一时区避免时间错误
#### 4. 执行SQL语句
使用`Statement`或`PreparedStatement`执行SQL:
```java
// 使用PreparedStatement防止SQL注入
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, 1001); // 替换第一个占位符
ResultSet resultSet = statement.executeQuery(); // 执行查询
处理查询结果
遍历ResultSet
获取数据:
while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); }
关闭连接释放资源
必须显式关闭连接以避免资源泄漏(推荐try-with-resources
):
try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { // 处理结果... } catch (SQLException e) { e.printStackTrace(); } // 自动关闭资源
完整代码示例
import java.sql.*; public class JdbcDemo { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/testdb"; String user = "user"; String password = "securePass123!"; try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM products"); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { System.out.println("Product: " + rs.getString("name") + ", Price: " + rs.getDouble("price")); } } catch (SQLException | ClassNotFoundException e) { System.err.println("数据库连接失败: " + e.getMessage()); } } }
关键注意事项
-
异常处理
始终捕获SQLException
并处理连接失败、SQL语法错误等场景:try { // JDBC操作... } catch (SQLException e) { System.err.println("SQL错误代码: " + e.getErrorCode()); e.printStackTrace(); }
-
防SQL注入
禁止直接拼接SQL字符串!务必使用PreparedStatement
:// 错误示例(危险!) String badSQL = "SELECT * FROM users WHERE name='" + inputName + "'"; // 正确做法 PreparedStatement safeStmt = conn.prepareStatement("SELECT * FROM users WHERE name=?"); safeStmt.setString(1, inputName);
-
连接池优化
高并发场景使用连接池(如HikariCP、Tomcat JDBC Pool)提升性能:HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(user); config.setPassword(password); HikariDataSource dataSource = new HikariDataSource(config); Connection conn = dataSource.getConnection(); // 从池中获取连接
-
安全实践
- 数据库密码加密存储(如使用环境变量或Vault)
- 生产环境启用SSL:在URL中添加
&useSSL=true&requireSSL=true
- 最小权限原则:为应用分配仅需的数据库权限
常见问题解决
错误类型 | 原因 | 解决方案 |
---|---|---|
No suitable driver |
URL格式错误或驱动未加载 | 检查URL拼写,确认Class.forName() 已执行 |
Access denied for user |
用户名/密码错误或权限不足 | 验证凭证,检查数据库用户权限 |
Connection timed out |
数据库服务未启动或网络不通 | 检查数据库状态及防火墙设置 |
ResultSet closed |
过早关闭Connection 或Statement |
确保结果处理完毕后再关闭资源 |
JDBC是Java操作数据库的基石,掌握其连接流程(加载驱动→建立连接→执行SQL→处理结果→关闭资源)是开发数据库应用的核心能力,关键要点包括:
- 使用
PreparedStatement
提升安全性与性能 - 通过
try-with-resources
确保资源释放 - 生产环境务必配置连接池和SSL加密
- 遵循最小权限原则管理数据库账户
引用说明:
- Oracle官方JDBC教程:JDBC Database Access
- MySQL Connector/J文档:MySQL JDBC Driver
- 安全规范参考:OWASP SQL Injection Prevention