1. 加载数据库驱动
JDBC 通过 驱动(Driver) 实现与不同数据库的通信。驱动需提前加载到 JVM:
手动加载(JDBC 4.0 前):
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动类
自动加载(JDBC 4.0+):通过 SPI 机制自动识别驱动类,无需显式调用。
2. 建立数据库连接
通过 DriverManager
或 连接池(如 HikariCP) 获取 Connection
对象:
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
3. 创建 Statement 对象
JDBC 提供三种执行 SQL 的接口:
接口 | 特点 |
---|---|
Statement |
静态 SQL,存在 SQL 注入风险,适用于简单查询。 |
PreparedStatement |
预编译 SQL,参数化传递,防止 SQL 注入,适合重复执行或含动态参数的 SQL。 |
CallableStatement |
调用存储过程。 |
示例:使用 PreparedStatement
String sql = "SELECT id, name FROM users WHERE age > ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 18); // 设置参数(索引从 1 开始)
4. 执行 SQL 并处理结果
执行 SQL
查询操作(返回 ResultSet
):
ResultSet rs = pstmt.executeQuery();
更新操作(返回影响行数):
int rowsAffected = pstmt.executeUpdate(); // INSERT/UPDATE/DELETE
处理结果集
while (rs.next()) { int id = rs.getInt("id");
// 按列名获取 String name = rs.getString(2); // 按索引获取(从 1 开始)
System.out.println(id + ": " + name); }
结果集类型:
TYPE_FORWARD_ONLY
:默认,只能向前遍历。TYPE_SCROLL_INSENSITIVE
:可滚动,不感知数据库变化。TYPE_SCROLL_SENSITIVE
:可滚动,感知数据库变化(多数驱动不实现)。
5. 事务管理(可选)
通过 Connection
控制事务:
try { conn.setAutoCommit(false); // 关闭自动提交
// 执行多个 SQL...
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
} finally {
conn.setAutoCommit(true); // 恢复自动提交
}
隔离级别:通过 conn.setTransactionIsolation(level)
设置(如 READ_COMMITTED
)。
6. 释放资源
必须显式关闭资源以避免内存泄漏和连接耗尽:
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close(); // 实际中连接池会回收而非真正关闭
} catch (SQLException e) {
e.printStackTrace();
}