
本文详解如何用 jdbc 正确连接 mysql 数据库、执行 select 查询并安全输出结果,涵盖驱动加载、异常处理、资源关闭等关键实践。
本文详解如何用 jdbc 正确连接 mysql 数据库、执行 select 查询并安全输出结果,涵盖驱动加载、异常处理、资源关闭等关键实践。
在 Java 中通过 JDBC 从 MySQL 数据库读取数据是一项基础但易出错的操作。你提供的代码逻辑基本正确,但存在多个影响运行结果的关键问题——包括异常捕获粒度不足、资源未显式释放、缺少空结果集验证,以及现代 JDBC 最佳实践的缺失。下面我们将逐项分析并提供健壮、可复用的解决方案。
✅ 正确的 JDBC 查询流程(推荐写法)
现代 Java(JDK 8+)推荐使用 try-with-resources 自动管理 Connection、Statement 和 ResultSet,避免因遗漏 close() 导致连接泄漏:
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"); // 表头提示
boolean hasData = false;
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);
hasData = true;
}
if (!hasData) {
System.out.println("⚠️ 查询结果为空:请确认表 'emp' 中已插入测试数据。");
}
} catch (SQLTimeoutException e) {
System.err.println("数据库连接超时:" + e.getMessage());
} catch (SQLException e) {
System.err.println("SQL 执行异常:" + e.getMessage());
e.printStackTrace(); // 开发阶段建议保留,便于定位错误(如表不存在、字段名错误等)
} catch (Exception e) {
System.err.println("未知异常:" + e.getMessage());
}
}
}
? 常见问题排查清单
- ✅ 驱动加载:MySQL Connector/J 8.0+(对应 com.mysql.cj.jdbc.Driver)无需手动 Class.forName() —— JDBC 4.0+ 规范支持自动服务发现。若使用旧版驱动(如 5.1.x),才需显式加载。
- ✅ URL 参数补充:添加 ?useSSL=false&serverTimezone=UTC 可避免 SSL 警告和时区异常(尤其在 MySQL 8.0+ 中常见)。
- ✅ 字段访问方式:优先使用 rs.getString("name") 而非 rs.getString(2),避免因 SQL 中列顺序变更或 SELECT 子句调整导致 IndexOutOfBoundsException。
- ✅ 空结果处理:务必检查 rs.next() 是否返回 false,否则无法判断是“无数据”还是“查询失败”。
-
✅ 数据库状态验证:运行前请确认:
- MySQL 服务已启动;
- 数据库 sonoo 已创建且 emp 表中已有数据(可用 INSERT INTO emp VALUES (1,'Alice',28); 测试);
- 用户 root 具备对 sonoo 库的 SELECT 权限。
⚠️ 重要注意事项
- 不要用 catch(Exception e) 宽泛捕获:它会掩盖 SQLException 的具体类型(如 SQLTimeoutException、SQLSyntaxErrorException),导致调试困难。应分层捕获,优先处理 SQLException 及其子类。
- 永远先关闭 ResultSet → Statement → Connection:虽然 try-with-resources 会按声明逆序自动关闭,但理解该顺序有助于手动管理场景(如连接池环境)。
- 生产环境禁用 root 账户直连:应创建专用应用用户并限制权限(如仅授予 SELECT on sonoo.emp)。
掌握以上要点后,你的 Java 程序将稳定、安全、清晰地从 MySQL 提取并展示数据——不仅是“能运行”,更是“可维护、可诊断、可上线”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











