Java JDBC能力提升需遵循“理解结构→动手闭环→暴露问题→优化加固”四步法:先跑通最小闭环(加载驱动→获取Connection→创建Statement→执行SQL→遍历ResultSet→关闭资源),确保控制台输出数据且无常见异常;URL、驱动类名须准确,关闭顺序为ResultSet→Statement→Connection并判空;用PreparedStatement防SQL注入,参数序号从1起、类型匹配;封装getConnection()和close()方法提升复用性;引入Druid或HikariCP连接池对比性能,理解其必要性。

从连接开始,先跑通一个最小闭环
别一上来就写 DAO 或工具类。用最简代码完成一次完整交互:加载驱动 → 获取 Connection → 创建 Statement → 执行一条 INSERT 或 SELECT → 遍历 ResultSet → 关闭资源。目标是让控制台真正打出数据,且不报 ClassNotFoundException、SQLException 或 NullPointerException。
- URL 写对:比如 MySQL 8+ 用 jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC,少参数或错字符会直接连不上
- 驱动类名写准:MySQL 8 对应 com.mysql.cj.jdbc.Driver,老版本是 com.mysql.jdbc.Driver,写错就 ClassNotFound
- 关闭顺序要反着来:ResultSet → Statement → Connection,且每个都判空再 close,否则可能 NPE 中断后续关闭
用 PreparedStatement 替代 Statement,堵住 SQL 注入漏洞
把原来拼接 SQL 的地方(如 "INSERT INTO user VALUES('" + name + "', " + age + ")")全换成 ? 占位符。这不是“更高级的写法”,而是生产环境的底线要求。
- 预编译机制能防注入,也能提升批量执行效率
- setString(1, name)、setInt(2, age) 的序号从 1 开始,不是 0;类型必须和字段匹配,比如日期用 setTimestamp
- 执行 update 用 executeUpdate(),查询用 executeQuery(),别混用
封装通用操作,把重复逻辑抽成可复用的方法
每次开连接、关资源、处理异常都写一遍,很快就会烦躁并出错。抽出两个基础方法就能大幅提升可维护性:
- getConnection():统一管理 URL、用户名、密码,加 try-catch 包裹 Class.forName 和 getConnection,失败时抛 RuntimeException 方便上层感知
- close(AutoCloseable...):接收任意数量的 Connection/Statement/ResultSet,内部判空后逐个 close,一行调用收尾
有了这两个,增删改查方法体里就只剩核心 SQL 和参数设置,逻辑清晰、不易漏关资源。
立即学习“Java免费学习笔记(深入)”;
引入连接池,对比性能差异,理解“为什么需要它”
写个循环插入 100 条记录:一次用传统方式(每次 new Connection),另一次用 Druid 或 HikariCP。用 System.nanoTime() 记录耗时,你会直观看到差距——可能相差 5~10 倍。
- 连接池不是“锦上添花”,而是高并发场景下的刚需。Connection 是重量级对象,创建销毁成本高
- 配置初始大小、最大连接数、超时时间这些参数时,结合自己数据库的 max_connections 设置,避免池子过大拖垮 DB
- 获取连接后仍要 try-with-resources 或手动 close,只是归还给池,不是真销毁


















