You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

连接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执行逻辑也错了:

  1. CREATE TABLE是DDL语句,不能用executeQuery()executeQuery()是专门用来执行返回结果集的查询语句(比如SELECT)的,DDL语句(建表、删表这类)应该用execute(),你强行用ResultSet接收,不仅没用,还会触发额外异常。
  2. 遍历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环境下的操作提示

  1. 替换驱动Jar:把项目里旧的MySQL驱动删掉,下载对应版本的Jar包添加到项目库中。
  2. 不用换Tomcat:你的问题和Tomcat半毛钱关系都没有,之前看到的建议是其他场景的,别被误导了。
  3. 检查JDK版本:NetBeans8.0默认支持JDK7和JDK8,确保你的项目JDK版本和驱动兼容(5.x驱动支持JDK5+,8.x驱动必须JDK8及以上)。

内容的提问来源于stack exchange,提问作者Bharadwaj

火山引擎 最新活动