当前位置:首页 > 数据库 > 正文

JDBC如何连接数据库?

使用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()获取连接对象,需提供:

JDBC如何连接数据库?  第1张

  • 数据库URLjdbc: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());
        }
    }
}

关键注意事项

  1. 异常处理
    始终捕获SQLException并处理连接失败、SQL语法错误等场景:

    try {
        // JDBC操作...
    } catch (SQLException e) {
        System.err.println("SQL错误代码: " + e.getErrorCode());
        e.printStackTrace();
    }
  2. 防SQL注入
    禁止直接拼接SQL字符串!务必使用PreparedStatement

    // 错误示例(危险!)
    String badSQL = "SELECT * FROM users WHERE name='" + inputName + "'";
    // 正确做法
    PreparedStatement safeStmt = conn.prepareStatement("SELECT * FROM users WHERE name=?");
    safeStmt.setString(1, inputName);
  3. 连接池优化
    高并发场景使用连接池(如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();  // 从池中获取连接
  4. 安全实践

    • 数据库密码加密存储(如使用环境变量或Vault)
    • 生产环境启用SSL:在URL中添加&useSSL=true&requireSSL=true
    • 最小权限原则:为应用分配仅需的数据库权限

常见问题解决

错误类型 原因 解决方案
No suitable driver URL格式错误或驱动未加载 检查URL拼写,确认Class.forName()已执行
Access denied for user 用户名/密码错误或权限不足 验证凭证,检查数据库用户权限
Connection timed out 数据库服务未启动或网络不通 检查数据库状态及防火墙设置
ResultSet closed 过早关闭ConnectionStatement 确保结果处理完毕后再关闭资源

JDBC是Java操作数据库的基石,掌握其连接流程(加载驱动→建立连接→执行SQL→处理结果→关闭资源)是开发数据库应用的核心能力,关键要点包括:

  • 使用PreparedStatement提升安全性与性能
  • 通过try-with-resources确保资源释放
  • 生产环境务必配置连接池和SSL加密
  • 遵循最小权限原则管理数据库账户

引用说明

  • Oracle官方JDBC教程:JDBC Database Access
  • MySQL Connector/J文档:MySQL JDBC Driver
  • 安全规范参考:OWASP SQL Injection Prevention
0