
本文详解如何用 java + jdbc 安全、可靠地连接 mysql 数据库,执行 select 查询并完整输出结果,涵盖驱动加载、资源管理、异常处理及常见陷阱规避。
本文详解如何用 java + jdbc 安全、可靠地连接 mysql 数据库,执行 select 查询并完整输出结果,涵盖驱动加载、资源管理、异常处理及常见陷阱规避。
在 Java 中通过 JDBC 从 MySQL 数据库读取并显示表数据,看似简单,但实际开发中常因资源未释放、异常捕获不精准、驱动兼容性或 SQL 执行逻辑疏漏导致“无输出”——即使代码编译通过、连接成功,ResultSet 仍可能为空或程序静默失败。以下是一份结构清晰、生产可用的完整实践指南。
✅ 正确的 JDBC 查询流程(推荐使用 try-with-resources)
现代 Java(JDK 7+)强烈建议使用 try-with-resources 自动管理 Connection、Statement 和 ResultSet,避免因忘记关闭资源引发内存泄漏或连接池耗尽:
import java.sql.*;
public class MysqlCon {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/sonoo?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "Password@123";
// 使用 try-with-resources 确保自动关闭
try (Connection con = DriverManager.getConnection(url, username, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM emp")) {
System.out.println("ID\tName\tAge");
System.out.println("------------------------");
while (rs.next()) {
int id = rs.getInt("id"); // 推荐使用列名而非序号,增强可读性与健壮性
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.printf("%d\t%s\t%d%n", id, name, age);
}
} catch (SQLException e) {
System.err.println("数据库操作异常:" + e.getMessage());
e.printStackTrace(); // 开发阶段保留,生产环境建议记录到日志
}
// Class.forName() 在 JDBC 4.0+(MySQL Connector/J 8.0+)中已非必需,驱动会自动注册
}
}
⚠️ 关键注意事项与常见问题排查
驱动版本与 URL 参数:
若使用 MySQL Connector/J 8.0+(如 mysql-connector-java:8.0.33),必须添加 serverTimezone=UTC(或匹配数据库时区)和 useSSL=false(若未配置 SSL)。否则连接可能超时或抛出 Communications link failure。列索引 vs 列名:
原代码中 rs.getInt(1) 依赖字段顺序,一旦 emp 表结构变更(如新增字段或调整顺序),极易出错。始终优先使用列名(如 rs.getInt("id")),语义清晰且解耦。异常处理要具体:
原代码 catch(Exception e) 过于宽泛,会掩盖 SQLException 的关键信息(如 SQL 语法错误、表不存在、权限不足)。应单独捕获 SQLException,并打印堆栈以定位真实原因。资源关闭顺序:
即使不使用 try-with-resources,也须按 ResultSet → Statement → Connection 逆序关闭(JDBC 规范要求),否则可能触发警告甚至连接泄露。文档明确指出:“A ResultSet object should be closed before its Statement object, and a Statement object should be closed before its Connection object.”验证数据是否存在:
若仍无输出,请手动登录 MySQL 执行 SELECT * FROM emp; 确认表中有数据;同时检查数据库名(sonoo)、表名(emp)大小写是否与系统设置一致(Linux 下默认区分)。
✅ 总结
一个健壮的 JDBC 查询程序 = 正确的连接参数 + 显式列名访问 + 精准异常捕获 + 自动资源管理。摒弃 Class.forName()(JDBC 4.0+ 自动服务发现)、避免裸 Exception 捕获、坚持使用 try-with-resources,即可显著提升代码可靠性与可维护性。掌握这些实践,你将不再被“查不到数据”的假象困扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











