You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注入漏洞。

修复方案
  1. 先把对应版本的ojdbc驱动包放到项目WEB-INF/lib目录,添加为项目依赖
  2. 执行项目clean操作,清空Tomcat下的旧部署缓存,重新编译部署项目
  3. 替换原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:45:36