连接MySQL数据库触发SQL异常及类转换错误求助
解决MySQL连接时的ClassCastException(BigInteger转Long)问题
嘿,我来帮你捋清楚这个问题——你遇到的ClassCastException和代码里的几个小错误我都看到了,咱们一步步解决:
一、先搞定连接时的ClassCastException
这个异常的根本原因是MySQL JDBC驱动版本和你的MySQL服务器/JDK版本不兼容。你用的是旧的com.mysql.jdbc.Driver驱动类,当连接高版本MySQL服务器时,驱动在处理排序规则相关的数值时,会把BigInteger强行转成Long,而服务器返回的数值超出了Long的范围,直接触发了异常。
给你两个针对性解决方案:
- 如果你的MySQL是5.7及以下版本:直接换成
mysql-connector-java 5.1.49版本,这个版本对JDK7/JDK8(NetBeans8.0常用的JDK版本)兼容性拉满,完美解决这个强转问题。 - 如果你的MySQL是8.0及以上:得用
mysql-connector-java 8.0.x版本,同时注意把驱动类改成com.mysql.cj.jdbc.Driver,还要在JDBC URL里加时区参数,比如jdbc:mysql://localhost:3306/Dust?serverTimezone=UTC。
二、你的代码还有两个致命逻辑错误
别光盯着连接问题,你的SQL执行逻辑也错了:
CREATE TABLE是DDL语句,不能用executeQuery():executeQuery()是专门用来执行返回结果集的查询语句(比如SELECT)的,DDL语句(建表、删表这类)应该用execute(),你强行用ResultSet接收,不仅没用,还会触发额外异常。- 遍历ResultSet完全是多余的:建表操作根本不会返回任何结果集,
while(rs.next())这段代码完全没必要写,而且会直接报错。
给你改好的代码,你可以直接用:
package jdbc; import java.sql.*; public class Jdbc { public static void main(String[] args) { // 根据你的MySQL版本选驱动类,5.x用下面这个,8.x换成com.mysql.cj.jdbc.Driver String driverClass = "com.mysql.jdbc.Driver"; // 5.x版本URL,8.x要加serverTimezone=UTC String url = "jdbc:mysql://localhost:3306/Dust?useUnicode=true&characterEncoding=utf8"; String user = "root"; String password = "32577488"; Connection con = null; Statement stmt = null; try { // 显式注册驱动,比自动注册更稳妥 Class.forName(driverClass); con = DriverManager.getConnection(url, user, password); stmt = con.createStatement(); // 执行建表语句用execute() String createSql = "CREATE TABLE Persons\n" + "(\n" + "PersonID int,\n" + "LastName varchar(255),\n" + "FirstName varchar(255),\n" + "Address varchar(255),\n" + "City varchar(255)\n" + ");"; stmt.execute(createSql); System.out.println("表创建成功啦!"); // 如果要查表里的数据,再加这段SELECT逻辑 String querySql = "SELECT * FROM Persons"; ResultSet rs = stmt.executeQuery(querySql); while(rs.next()){ // 用列名获取值比下标更清晰,不容易出错 System.out.println(rs.getInt("PersonID") + " " + rs.getString("LastName") + " " + rs.getString("FirstName")); } } catch (ClassNotFoundException e) { System.err.println("找不到驱动类,检查Jar包有没有加对!"); e.printStackTrace(); } catch (SQLException e) { System.err.println("数据库操作出问题了!"); e.printStackTrace(); } finally { // 一定要按逆序关闭资源,避免内存泄漏 try { if(stmt != null) stmt.close(); if(con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
三、NetBeans环境下的操作提示
- 替换驱动Jar:把项目里旧的MySQL驱动删掉,下载对应版本的Jar包添加到项目库中。
- 不用换Tomcat:你的问题和Tomcat半毛钱关系都没有,之前看到的建议是其他场景的,别被误导了。
- 检查JDK版本:NetBeans8.0默认支持JDK7和JDK8,确保你的项目JDK版本和驱动兼容(5.x驱动支持JDK5+,8.x驱动必须JDK8及以上)。
内容的提问来源于stack exchange,提问作者Bharadwaj




