Servlet通过JDBC查询Oracle无输出 抛出ClassNotFoundException异常
问题诊断
你遇到的java.lang.ClassNotFoundException属于JDBC连接的典型类加载错误,结合你贴的代码和异常栈,一共存在5个需要修复的点:
- 核心原因:Web应用的类加载路径下没有Oracle JDBC驱动包。部署到Tomcat的Java Web项目,需要把对应JDK版本的Oracle驱动包(常用为
ojdbc8.jar适配JDK8+,ojdbc11.jar适配JDK11+)放到项目的WEB-INF/lib目录,或者直接放到Tomcat根目录的lib目录下,否则Tomcat的类加载器扫不到驱动类。 - 代码部署不一致:你贴的代码里写的是加载Oracle驱动
oracle.jdbc.driver.OracleDriver,但异常栈明确提示找不到com.mysql.jdbc.Driver(MySQL的旧驱动类),说明你改完代码没有执行clean重新编译,Tomcat上跑的还是之前写MySQL连接的旧字节码文件,旧代码没有被覆盖。 - 连接URL格式错误:你写的JDBC URL末尾带了
\r\n换行符,还在URL里拼接了HR/hr的账号密码,又在getConnection方法参数里传了system/system,账号配置重复、多余字符会直接导致连接失败。Oracle thin模式的正确URL格式为jdbc:oracle:thin:@<数据库IP>:1521:<服务名>,账号密码单独通过方法参数传入即可。 - 资源泄漏隐患:你把
stmt.close()、con.close()写在try块内部,只要前面的SQL执行抛出异常,这两个数据库资源永远不会被释放,拖久了会把数据库连接池占满。 - SQL注入风险:直接用字符串拼接的方式组装查询SQL,没有做参数转义,存在明显的SQL注入漏洞。
修复方案
- 先把对应版本的ojdbc驱动包放到项目
WEB-INF/lib目录,添加为项目依赖 - 执行项目clean操作,清空Tomcat下的旧部署缓存,重新编译部署项目
- 替换原有Servlet代码为修复后的版本:
public class EmployeeServlet extends HttpServlet { // 新版Oracle驱动推荐使用oracle.jdbc.OracleDriver,旧的oracle.jdbc.driver.OracleDriver已标记废弃 private static final String DRIVER = "oracle.jdbc.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl"; private static final String USER = "system"; private static final String PWD = "system"; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 建议增加参数非空、格式校验,避免前端传空值、非数字值直接抛异常 int empId = Integer.parseInt(request.getParameter("t2")); // 用try-with-resources语法自动关闭连接、语句、结果集,无需手动写close逻辑 try ( Connection con = DriverManager.getConnection(URL, USER, PWD); PreparedStatement pstmt = con.prepareStatement("select * from employee where emp_id = ?") ) { Class.forName(DRIVER); // 占位符参数赋值,从1开始计数,避免SQL注入 pstmt.setInt(1, empId); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt(1)); System.out.println(rs.getString(2)); } // 补全你之前没写完的成功页跳转逻辑 response.sendRedirect("success.jsp"); } catch (Exception e) { e.printStackTrace(); // 异常场景跳错误页 response.sendRedirect("error.jsp"); } } }
排查校验顺序
- 可以先写一个普通的main方法测试JDBC连接,确认本地Oracle服务启动、账号密码、服务名配置正确,能正常查到employee表数据
- 再把验证通过的逻辑放到Servlet中,排除Tomcat类加载、部署缓存的干扰
- 要是还是报类找不到,直接去Tomcat部署路径下的项目
WEB-INF/lib目录里确认ojdbc包确实存在,没有丢包
内容的提问来源于stack exchange,提问作者Not me
相关产品推荐
相关产品推荐

