← [ BACK_TO_NOTES ]

Java JDBC 与数据访问

JDBC 核心接口、参数化查询、事务与资源关闭:数据访问正确性底座。

#concept #growing #dev #java

[!info] related notes

Java JDBC 与数据访问

这个概念为什么出现

持久化是后端核心。JDBC 提供统一的关系库访问 API:连接、语句、结果集、事务。ORM 建立在这些概念之上。

[!abstract] 一句话理解 JDBC 用 DataSource/Connection 获取连接,用 PreparedStatement 参数化执行 SQL,用 try-with-resources 关闭资源,并用 commit/rollback 管理事务边界。

最小可运行示例

场景:参数化查询用户

findName 需要调用方提供有效连接,以及 users(id bigint primary key, name varchar(100) not null) 表。这里返回 null 只表示没有该 ID;若 name 可为 SQL NULL,必须另行区分“无行”和“有行但空值”。

import java.sql.*;

public class UserDaoExample {
    // findName:按 id 查名称。
    // 仅关闭本方法创建的语句和结果集;连接与事务归调用方。
    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
    }
}

下面仅验证代码能编译及 main 能运行;没有连接数据库,不代表查询已验证。实际调用还需 JDBC 驱动、连接配置和上述表。

javac UserDaoExample.java && java UserDaoExample

期望:

jdbc-pattern-ready

结合场景再看三个关注点

  1. ? 绑定值,不代替表名、列名或排序方向;动态标识符需从允许集合中选择,不能拼入原始用户输入。
  2. 按所有权关闭资源:本方法关闭 Statement/ResultSet;连接由创建它的调用方或框架管理,不能随意关闭借入连接。
  3. 事务在业务用例边界提交。

核心概念与准确模型

1. 核心类型

Connection / Statement / PreparedStatement / ResultSet / DataSource

2. 事务

新 JDBC 连接通常默认 auto-commit;连接池或框架可能已配置其他模式。手动事务先设 setAutoCommit(false),成功 commit,失败显式 rollback。不要把 close 当作可靠 rollback;带未完成事务关闭连接的结果依赖实现。将 auto-commit 从 false 改回 true 会提交当前事务,必须先明确结束事务;框架托管事务不应在 DAO 内自行改模式或提交。

3. 连接池

生产用 HikariCP 等;close 归还连接。

边界情况与反直觉行为

  1. 流式大结果集内存。
  2. 数据库时区与时间类型。
  3. 持有连接穿越远程调用。

常见误区

[!warning] 常见误区:拼接用户输入进 SQL SQL 注入。

工程实践

  1. 仓储模式隔离 SQL。
  2. 迁移工具管理 schema。
  3. 超时与重试策略谨慎。
  4. 集成测试用 Testcontainers(后置)。

本节总结

  • JDBC 是底座
  • 参数化 + 资源 + 事务
  • ORM 不能替你懂它

自测题

  1. 为什么优先 PreparedStatement?
  2. 连接池 close 语义?
参考答案
  1. 值与 SQL 结构分离,避免把绑定值当作 SQL 代码;计划缓存收益取决于驱动、服务端及配置,不保证更快。
  2. 通常归还池,而非物理断开(视实现)。

延伸阅读与资料来源

资料类型支撑内容
JDBC Basics教程JDBC
java.sql packageAPI接口
创建于 2026/7/15 更新于 2026/10/6
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本