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

结合场景再看三个关注点

  1. ? 占位,禁止字符串拼 SQL。
  2. Connection/Statement/ResultSet 都要关
  3. 事务在业务用例边界提交。

核心概念与准确模型

1. 核心类型

Connection / Statement / PreparedStatement / ResultSet / DataSource

2. 事务

setAutoCommit(false) → 工作 → commit/rollback

3. 连接池

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

边界情况与反直觉行为

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

常见误区

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

工程实践

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

本节总结

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

自测题

  1. 为什么优先 PreparedStatement?
  2. 连接池 close 语义?
参考答案
  1. 参数绑定降低注入与计划缓存收益。
  2. 通常归还池,而非物理断开(视实现)。

延伸阅读与资料来源

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