JDBC连接MySQL报错无法查询获取表数据的排查与解决
JDBC连接MySQL报错排查
错误原因汇总
- 驱动类过时警告:使用的是MySQL Connector/J 8.0及以上版本驱动,旧版驱动类
com.mysql.jdbc.Driver已被标记废弃,官方推荐使用新驱动类com.mysql.cj.jdbc.Driver;同时高版本JDBC已支持SPI机制自动注册驱动,手动调用Class.forName()加载驱动属于冗余操作,无需额外编写。 - 核心运行时异常根因:代码调用
executeQuery方法时,传入的是带双引号的字符串字面量"query",而非提前定义好、存储了查询SQL语句的query变量。JDBC会把传入的"query"字符串直接作为SQL语句执行,这不是合法的查询语句,无法返回结果集,因此抛出Statement.executeQuery() cannot issue statements that do not produce result sets异常。 - 潜在兼容问题:高版本MySQL连接如果不在URL中指定时区、关闭SSL校验等参数,大概率会出现时区不匹配、SSL连接警告等问题;原代码手动调用
close()释放资源的写法,如果中间执行抛出异常,会导致数据库连接无法释放,引发资源泄漏。
修正后可运行代码
import java.sql.*; public class JdbcDemo { public static class jdbcTest { public static void main(String[] args) throws Exception { // URL补充时区、字符集、SSL配置参数,避免高版本MySQL连接兼容问题 String url = "jdbc:mysql://localhost:3306/coffee_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"; String uname = "Jeep"; String pass = "random"; String query = "select * from customers;"; // 移除冗余的手动驱动加载逻辑 // 使用try-with-resources语法自动释放连接、语句、结果集资源,无需手动调用close() try (Connection con = DriverManager.getConnection(url,uname,pass); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(query)) { // 去掉query的引号,传入存储SQL的变量本身 while (rs.next()) { String name = rs.getString("first_name"); System.out.println(name); } } } } }
额外校验点
如果修正后仍无法运行,自行核对以下配置:
- 数据库账号
Jeep的密码是否正确,该账号是否有coffee_db库的查询权限 - 本地3306端口的MySQL服务是否正常启动,
coffee_db库、customers表是否存在,表中是否有first_name字段 - 项目引入的MySQL驱动版本和本地安装的MySQL服务大版本匹配:MySQL 8.x对应引入8.0.x版本的Connector/J依赖,MySQL 5.x对应引入5.1.x版本的依赖
内容的提问来源于stack exchange,提问作者Jeet Kumar Pal
相关产品推荐
相关产品推荐

