JDBC是Java连接数据库的标准API,通过获取连接、创建语句、执行操作、处理结果、释放资源五步完成CRUD;推荐使用PreparedStatement防SQL注入,try-with-resources自动关资源,URL和凭据应避免硬编码。

JDBC 是 Java 连接数据库的标准 API,通过它可以用纯 Java 代码完成对数据库的增删改查(CRUD)。核心在于获取连接、创建语句、执行操作、处理结果、释放资源这五个步骤。
一、准备工作:加载驱动与获取 Connection
现代 JDBC 驱动(如 MySQL 8.0+、PostgreSQL)通常支持自动注册,无需显式 Class.forName()。重点是用 DriverManager.getConnection() 获取连接:
- URL 格式示例:
MySQL:"jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"
PostgreSQL:"jdbc:postgresql://localhost:5432/mydb" - 需要提供用户名和密码,建议从配置文件或环境变量读取,避免硬编码
- 推荐使用 try-with-resources 自动关闭连接,防止资源泄漏
二、插入数据(Create):用 PreparedStatement 防 SQL 注入
不要拼接 SQL 字符串!用 PreparedStatement 占位符(?)设置参数:
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "张三");
ps.setString(2, "zhangsan@example.com");
int rows = ps.executeUpdate(); // 返回影响行数
System.out.println("插入成功,影响 " + rows + " 行");
}
-
executeUpdate()用于 INSERT/UPDATE/DELETE,返回受影响行数 - 主键自增时,可加
Statement.RETURN_GENERATED_KEYS获取刚插入的 ID
三、查询数据(Read):遍历 ResultSet 处理结果集
SELECT 操作用 executeQuery(),返回 ResultSet 对象:
立即学习“Java免费学习笔记(深入)”;
String sql = "SELECT id, name, email FROM users WHERE age > ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 18);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.printf("ID:%d, 姓名:%s, 邮箱:%s%n", id, name, email);
}
}
}
- 用
rs.next()移动到下一行,返回false表示无更多数据 - 推荐用列名(如
rs.getString("name"))而非序号取值,更易维护 - 注意
ResultSet默认只能单向向前遍历;如需倒序或多次遍历,创建时指定类型
四、更新与删除(Update/Delete):同样走 PreparedStatement
UPDATE 和 DELETE 逻辑类似 INSERT,都调用 executeUpdate():
// 更新 String updateSql = "UPDATE users SET email = ? WHERE id = ?"; ps = conn.prepareStatement(updateSql); ps.setString(1, "new@exam.com"); ps.setInt(2, 1001); int updated = ps.executeUpdate(); // 返回实际更新行数 // 删除 String deleteSql = "DELETE FROM users WHERE id = ?"; ps = conn.prepareStatement(deleteSql); ps.setInt(1, 1001); int deleted = ps.executeUpdate();
- 务必检查返回值(如
updated == 0),确认是否有匹配记录被修改或删除 - WHERE 条件不能省略,否则可能误清全表(尤其 DELETE)
- 批量操作可用
addBatch()+executeBatch()提升性能
不复杂但容易忽略的是异常处理和资源释放。始终用 try-with-resources 包裹 Connection、Statement、ResultSet;捕获 SQLException 并记录日志,而不是简单打印堆栈。业务逻辑尽量与 JDBC 细节解耦,后续可平滑迁移到 JdbcTemplate 或 MyBatis 等框架。


















