运行Java代码时出现ClassCastException类型转换异常求助
问题排查:java.lang.ClassCastException: org.sqlite.Conn 无法转换为 com.mysql.jdbc.Connection
错误信息
java.lang.ClassCastException: class org.sqlite.Conn cannot be cast to class com.mysql.jdbc.Connection (Connection are unnamed module)
核心原因
你的代码存在跨数据库驱动类型混用的问题:DbConnect.connect()方法实际返回的是SQLite数据库的连接实例(org.sqlite.Conn),但你试图将该连接配合MySQL的com.mysql.jdbc.PreparedStatement使用,不同数据库驱动的实现类无法互相强制转换,因此抛出类型转换异常。
另外代码还存在SQL注入风险,直接拼接字符串生成SQL语句是不安全的写法。
解决步骤
方案1:统一使用MySQL数据库
如果你的目标是连接MySQL数据库,按以下步骤修改:
- 检查
DbConnect类,确保它使用MySQL的JDBC驱动:- 驱动类:
com.mysql.cj.jdbc.Driver(新版)或com.mysql.jdbc.Driver(旧版) - 连接URL格式:
jdbc:mysql://主机地址:端口/数据库名?useSSL=false&serverTimezone=UTC
- 驱动类:
- 替换
PreparedStatement的导入为标准JDBC接口,避免依赖具体驱动实现:// 删除 import com.mysql.jdbc.PreparedStatement; import java.sql.PreparedStatement; - 修复SQL注入问题,改用参数化查询:
private void addbtnActionPerformed(java.awt.event.ActionEvent evt) { String name = namebox.getText(); String sql = "INSERT INTO student(name) VALUES(?)"; try { pst = conn.prepareStatement(sql); pst.setString(1, name); // 用参数替换字符串拼接 pst.executeUpdate(); // 执行更新操作推荐用executeUpdate JOptionPane.showMessageDialog(null, "Inserted"); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } }
方案2:统一使用SQLite数据库
如果你的目标是连接SQLite数据库,按以下步骤修改:
- 确认
DbConnect类使用SQLite的JDBC驱动:- 驱动类:
org.sqlite.JDBC - 连接URL格式:
jdbc:sqlite:/本地数据库文件路径/xxx.db
- 驱动类:
- 同样替换
PreparedStatement的导入为标准JDBC接口:import java.sql.PreparedStatement; - 用参数化查询替代SQL字符串拼接(同方案1的SQL写法)。
关键注意事项
- 永远基于标准JDBC接口(
java.sql.Connection、java.sql.PreparedStatement等)编写数据库代码,不要直接使用具体驱动的实现类,避免类型冲突同时提升代码兼容性。 - 必须杜绝SQL字符串拼接,参数化查询是预防SQL注入的标准做法。
内容的提问来源于stack exchange,提问作者Kely
相关产品推荐
相关产品推荐

