什么是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格式 |
|---|---|
| MySQL | jdbc:mysql://host:port/database |
| Oracle | jdbc:oracle:thin:@host:port:sid |
| SQL Server | jdbc:sqlserver://host:port;databaseName=dbname |
| PostgreSQL | jdbc:postgresql://host:port/database |
| SQLite | jdbc: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注入
- 实际项目推荐使用数据库连接池提升性能