JDBC如何连接数据库?
- 数据库
- 2025-07-04
- 3341
 使用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
 
  
			 
			