教程中心 / Java教程 / JDBC简介

JDBC简介

8分钟 数据库编程

什么是JDBC?

JDBC(Java Database Connectivity)是Java语言访问数据库的标准API。它提供了一套统一的接口,让Java程序可以连接各种数据库(MySQL、Oracle、SQL Server等),执行SQL语句,处理结果。

生活比喻

JDBC就像一个万能电源适配器。无论你使用的是220V的空调还是5V的手机充电器,只要有适配器,就能把它们连接到统一的电源网络上。JDBC就是Java程序和数据库之间的"适配器",让Java可以用统一的方式操作各种数据库。

JDBC的架构

JDBC架构:

┌─────────────────────────────────────────────────────────────┐
│                        Java Application                      │
│                      (你的Java程序)                          │
└─────────────────────────┬───────────────────────────────────┘
                          │ JDBC API
┌─────────────────────────▼───────────────────────────────────┐
│                    DriverManager                            │
│              (管理数据库驱动)                                │
└─────────────────────────┬───────────────────────────────────┘
                          │ 调用
┌─────────────────────────▼───────────────────────────────────┐
│                   JDBC Driver                                │
│          (每种数据库有自己的驱动实现)                         │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐        │
│  │ MySQL   │  │Oracle   │  │ SQL     │  │Postgre  │        │
│  │ Driver  │  │ Driver  │  │ Server  │  │SQL      │        │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘        │
└───────┼────────────┼────────────┼────────────┼───────────────┘
        │            │            │            │
        ▼            ▼            ▼            ▼
    ┌───────┐   ┌───────┐   ┌───────┐   ┌───────┐
    │ MySQL │   │Oracle │   │ SQL   │   │Postgre│
    │  DB   │   │  DB   │   │Server │   │  DB   │
    └───────┘   └───────┘   └───────┘   └───────┘

JDBC操作数据库的六大步骤

1

加载并注册驱动

告诉JDBC你要连接哪种数据库

// 方式1:传统方式(现在已不推荐)
Class.forName("com.mysql.cj.jdbc.Driver");

// 方式2:MySQL 8.0+ 自动加载(不需要显式调用)
// 只要在classpath中包含驱动jar包即可
2

获取数据库连接

通过DriverManager建立与数据库的连接

String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "123456";

Connection conn = DriverManager.getConnection(url, user, password);
3

创建Statement对象

用于执行SQL语句

Statement stmt = conn.createStatement();
// 或者使用PreparedStatement(推荐,防止SQL注入)
PreparedStatement ps = conn.prepareStatement(sql);
4

执行SQL语句

查询用executeQuery,增删改用executeUpdate

// 查询
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

// 增删改
int affected = stmt.executeUpdate(
    "INSERT INTO users (name, age) VALUES ('张三', 25)"
);
5

处理结果集

遍历ResultSet获取数据

while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    System.out.println(id + ": " + name);
}
6

关闭资源

按倒序关闭ResultSet、Statement、Connection

rs.close();
stmt.close();
conn.close();

// 现代Java推荐使用try-with-resources自动关闭

完整示例代码

import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) {
        // JDBC配置
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = "123456";

        // 使用try-with-resources自动关闭资源
        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {

            // 处理结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println(id + ": " + name + ", " + age);
            }

        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库操作失败: " + e.getMessage());
        }
    }
}

常见的数据库URL

数据库JDBC URL格式
MySQLjdbc:mysql://host:port/database
Oraclejdbc:oracle:thin:@host:port:sid
SQL Serverjdbc:sqlserver://host:port;databaseName=dbname
PostgreSQLjdbc:postgresql://host:port/database
SQLitejdbc:sqlite:database.db

JDBC四大核心组件

组件类型作用
DriverManager管理数据库驱动,根据URL加载并创建连接
Connection接口表示与数据库的连接会话,用于创建Statement
Statement接口执行静态SQL语句,返回ResultSet
ResultSet接口表示查询结果集,类似"表格",通过游标遍历

Statement vs PreparedStatement

推荐使用PreparedStatement

PreparedStatement是Statement的子接口,不仅性能更好,还能有效防止SQL注入攻击。

// Statement(不推荐 - 有SQL注入风险)
String name = "张三'; DROP TABLE users; --";
stmt.executeQuery("SELECT * FROM users WHERE name = '" + name + "'");

// PreparedStatement(推荐 - 参数化查询)
PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM users WHERE name = ? AND age > ?"
);
ps.setString(1, name);
ps.setInt(2, 18);
ResultSet rs = ps.executeQuery();

需要的依赖

要连接数据库,需要在项目中添加对应的JDBC驱动jar包:

Maven
<!-- MySQL -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
Gradle
// MySQL
implementation 'mysql:mysql-connector-java:8.0.33'

常见错误和注意事项

错误1:忘记关闭资源

Connection、Statement、ResultSet用完不关闭,可能导致数据库连接泄漏。使用try-with-resources确保资源关闭。

错误2:忘记导入数据库驱动

运行时报ClassNotFoundException,请确认已将JDBC驱动jar包添加到classpath或build.gradle中。

提示:实际项目推荐使用数据库连接池

每次创建数据库连接都有开销。生产环境推荐使用HikariCP、Druid等连接池框架管理连接。

小结

  • JDBC是Java操作数据库的标准API,提供统一接口访问各种数据库
  • 六大步骤:加载驱动 → 获取连接 → 创建Statement → 执行SQL → 处理结果 → 关闭资源
  • try-with-resources是现代Java推荐的资源管理方式
  • 推荐使用PreparedStatement而非Statement,防止SQL注入
  • 实际项目推荐使用数据库连接池提升性能
☕ Java 在线代码编辑器
📝 运行结果