JDBC Rowset连接MySQL报No suitable driver错误,已加驱动仍未解决
问题根因
该报错是JdbcRowSetImpl建立连接时无法加载MySQL驱动类导致的。JDBC4.0+之后虽然支持SPI自动注册驱动,但JdbcRowSet默认不会主动触发驱动类加载,之前能正常运行大概率是其他代码触发过驱动注册,后续环境变动后缺少触发条件就会抛出该错误。
可行解决方案
方案1:显式注册MySQL驱动
在初始化JdbcRowSet之前手动加载驱动类即可,根据你使用的Connector/J版本选择对应类名:
- MySQL Connector/J 5.x版本驱动类:
com.mysql.jdbc.Driver - MySQL Connector/J 8.x版本驱动类:
com.mysql.cj.jdbc.Driver
加载代码插在JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();行之前即可。
方案2:修正JDBC URL适配驱动要求
如果你使用的是8.x版本的Connector/J,需要在URL中补充时区等必要参数,避免驱动识别失败,修改后的URL示例:jdbc:mysql://localhost:3306/student_manage?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
同时需要确认Connector/J版本与MySQL服务端版本匹配:MySQL 8.x服务端用Connector/J 8.0及以上版本,MySQL 5.7及以下服务端用Connector/J 5.1.49及以上版本。
方案3:排查运行时类路径配置
- 如果你使用IDE开发,确认添加的MySQL驱动依赖是运行时生效,不是仅编译时依赖,很多场景下仅配置编译依赖会导致运行时找不到驱动类。
- 如果你是打包后独立运行,确认Jar包已经把MySQL驱动打进去,或者运行时通过
java -cp .:mysql-connector-java-xxx.jar question_3.JDBCRowset命令显式指定类路径。
修改后完整代码示例
package question_3; import java.sql.ResultSetMetaData; import java.sql.SQLException; import javax.sql.rowset.JdbcRowSet; import javax.sql.rowset.RowSetProvider; public class JDBCRowset { public static void main(String[] args) throws Exception { // 手动加载MySQL驱动,5.x版本替换为com.mysql.jdbc.Driver Class.forName("com.mysql.cj.jdbc.Driver"); try { JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet(); String DATABASE_URL = "jdbc:mysql://localhost:3306/student_manage?useSSL=false&serverTimezone=Asia/Shanghai"; String USERNAME = "root"; String PASSWORD = "24121998"; rowSet.setUrl(DATABASE_URL); rowSet.setUsername(USERNAME); rowSet.setPassword(PASSWORD); rowSet.setCommand("SELECT * FROM authors"); rowSet.execute(); ResultSetMetaData metaData = rowSet.getMetaData(); int numberOfColumns = metaData.getColumnCount(); System.out.printf("Authors Table : %n%n"); for (int i = 1; i <= numberOfColumns; i++) System.out.printf("%-15s\t", metaData.getColumnName(i)); System.out.println(); while (rowSet.next()) { for (int i = 1; i <= numberOfColumns; i++) System.out.printf("%-15s\t",rowSet.getObject(i)); System.out.println(); } } catch (SQLException sqlException) { sqlException.printStackTrace(); System.exit(1); } } }
内容的提问来源于stack exchange,提问作者Purushottam
相关产品推荐
相关产品推荐

