Java JDBC 与数据访问
JDBC 核心接口、参数化查询、事务与资源关闭:数据访问正确性底座。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
Java JDBC 与数据访问
这个概念为什么出现
持久化是后端核心。JDBC 提供统一的关系库访问 API:连接、语句、结果集、事务。ORM 建立在这些概念之上。
[!abstract] 一句话理解 JDBC 用
DataSource/Connection获取连接,用PreparedStatement参数化执行 SQL,用 try-with-resources 关闭资源,并用 commit/rollback 管理事务边界。
最小可运行示例
场景:参数化查询用户(示意代码,需真实驱动与库)
import java.sql.*;
public class UserDaoExample {
// findName:按 id 查名称。
// 教学点:PreparedStatement 防拼接注入;TWR 关闭。
static String findName(Connection conn, long id) throws SQLException {
String sql = "select name from users where id = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, id);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) return null;
return rs.getString(1);
}
}
}
public static void main(String[] args) {
System.out.println("jdbc-pattern-ready");
// 真实:DriverManager.getConnection / DataSource.getConnection
}
}
javac UserDaoExample.java && java UserDaoExample
期望:
jdbc-pattern-ready
结合场景再看三个关注点
?占位,禁止字符串拼 SQL。- Connection/Statement/ResultSet 都要关。
- 事务在业务用例边界提交。
核心概念与准确模型
1. 核心类型
Connection / Statement / PreparedStatement / ResultSet / DataSource
2. 事务
setAutoCommit(false) → 工作 → commit/rollback
3. 连接池
生产用 HikariCP 等;close 归还连接。
边界情况与反直觉行为
- 流式大结果集内存。
- 数据库时区与时间类型。
- 持有连接穿越远程调用。
常见误区
[!warning] 常见误区:拼接用户输入进 SQL SQL 注入。
工程实践
- 仓储模式隔离 SQL。
- 迁移工具管理 schema。
- 超时与重试策略谨慎。
- 集成测试用 Testcontainers(后置)。
本节总结
- JDBC 是底座
- 参数化 + 资源 + 事务
- ORM 不能替你懂它
自测题
- 为什么优先 PreparedStatement?
- 连接池 close 语义?
参考答案
- 参数绑定降低注入与计划缓存收益。
- 通常归还池,而非物理断开(视实现)。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| JDBC Basics | 教程 | JDBC |
| java.sql package | API | 接口 |