使用Apache NetBeans连接Oracle 10g时遇ClassNotFoundException求助
嘿,我来帮你一步步搞定这个问题,先从代码里的明显小错误开始,再处理核心的ClassNotFoundException异常:
首先,你的代码里有个笔误:在DriverManager.getConnection方法里,你写的参数是passed,但前面定义的密码变量名是passwd,这会直接导致编译错误,先把这个修正过来:
Connection con=DriverManager.getConnection(url,uname, passwd);
接下来解决最头疼的类未找到问题,从这几个方向排查:
1. 驱动版本不兼容是大概率原因
你用的是Oracle 10g,但下载的是ojdbc7.jar——ojdbc7是为Java 7和Oracle 11g/12c设计的驱动,和Oracle 10g的兼容性很差。建议换成ojdbc14.jar,这个版本是专门对应Oracle 10g的,支持Java 5/6,适配性拉满。
2. 别只配置DB Services的驱动,项目运行类路径也要加
你说已经把驱动添加到DB Services的ORACLE THIN驱动里,但那只是给NetBeans的数据库连接测试用的,项目实际运行时的类路径得单独配置:
- 右键你的项目 → 选
Properties - 进入
Libraries选项卡 - 点击
Add JAR/Folder,找到你下载的ojdbc驱动jar文件添加进去 - 点
OK确认,这样项目编译和运行时才能找到驱动类
3. 驱动类名要对应版本(可选)
如果坚持要用ojdbc7,注意从Oracle 11g开始,官方把驱动类名改成了oracle.jdbc.OracleDriver(去掉了中间的.driver),所以代码里的Class.forName可以改成:
Class.forName("oracle.jdbc.OracleDriver");
另外,从Java 6开始,JDBC 4.0支持自动加载驱动,你甚至可以直接删掉Class.forName这一行,DriverManager会自动扫描类路径下的驱动文件,省心不少。
4. 顺便检查数据库连接信息
确认你的Oracle服务名确实是orcl,端口1521没问题,用户名sh和密码ara都是正确的,而且Oracle数据库服务已经正常启动了哦。
最后给你修正后的完整代码
import java.sql.*; public class jdbclass { public static void main(String args[]) throws ClassNotFoundException, SQLException { String url="jdbc:oracle:thin:@localhost:1521:orcl"; String uname="sh"; String passwd="ara"; String query="select pizza_type from pizza"; // JDBC 4.0+可以省略这行,自动加载驱动 // Class.forName("oracle.jdbc.OracleDriver"); Connection con=DriverManager.getConnection(url,uname, passwd); Statement st=con.createStatement(); ResultSet rs=st.executeQuery(query); // 重要:必须先调用rs.next()移动游标,才能获取数据 if(rs.next()){ String name=rs.getString("pizza_type"); System.out.print(name); } // 记得关闭资源,也可以用try-with-resources自动关闭 st.close(); con.close(); } }
哦对了,原代码里你先调用rs.getString再调用rs.next(),这会拿不到数据的,必须先移动游标到第一条记录再获取字段值,我已经在修正后的代码里改过来了。
内容的提问来源于stack exchange,提问作者Aravind P

