如何排查并解决Java中的java.SQLException: no table used错误
解决java.SQLException: no table used异常
问题根源
你代码里的第一句测试查询select * ;是异常触发点。虽然MySQL命令行可能允许这种不指定表的写法,但MySQL JDBC驱动对SQL语法的检查更严格,不接受没有明确指定表的SELECT语句,因此抛出no table used异常。
修复方案
直接移除这句无意义的测试查询,或者替换成合法的连接测试语句:
方案1:移除测试查询
修改后的代码:
public static void main(String[] args) throws SQLException,ClassNotFoundException { try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection Con = DriverManager.getConnection("jdbc:mysql://localhost:3306/eldenringbuildgenerator" , "root", "admin"); Statement teststmt = Con.createStatement(); // 移除错误的select *;查询 ResultSet rs = teststmt.executeQuery("select ArmorTypeID,ArmorTypeName from armortypes;"); while (rs.next()) { System.out.print(rs.getInt(1) + " " + rs.getString(2) + " " ); } } catch (SQLException e){ System.out.print(e); } }
方案2:替换为合法的连接测试语句
如果需要保留连接测试,可以用select 1;这种不需要表的合法查询(JDBC驱动认可该语法):
public static void main(String[] args) throws SQLException,ClassNotFoundException { try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection Con = DriverManager.getConnection("jdbc:mysql://localhost:3306/eldenringbuildgenerator" , "root", "admin"); Statement teststmt = Con.createStatement(); // 用select 1测试连接 ResultSet rs = teststmt.executeQuery("select 1;"); rs = teststmt.executeQuery("select ArmorTypeID,ArmorTypeName from armortypes;"); while (rs.next()) { System.out.print(rs.getInt(1) + " " + rs.getString(2) + " " ); } } catch (SQLException e){ System.out.print(e); } }
补充说明
MySQL JDBC驱动(尤其是8.0+版本)对SQL语法的兼容性和严格性比命令行客户端更高,一些在命令行中能“侥幸运行”的不规范SQL,在JDBC执行时会触发语法校验异常。编写JDBC代码时尽量遵循标准SQL语法,避免依赖MySQL命令行的特殊兼容行为。
内容的提问来源于stack exchange,提问作者We ball
相关产品推荐
相关产品推荐

