我在Eclipse中有一个简单的Java项目,它可以连接到多个数据库,并且我试图修改它以允许从属性文件配置连接参数。
在目前阶段,我有一个工作DBHelper
类,它提供了一个getDatabaseConnection()
方法,返回使用硬编码参数实例化的Connection
项。
我正在尝试创建一个类似的类,它执行相同但从属性文件中读取参数。
它被称为PropertyParser
并提供getDBConnection()
方法。
事实是Class.forName()
方法如果从后者调用失败,即使属性文件中保存的所有连接数据完全在DBHelper
类中的硬编码相同,并且都引用完整的类名(oracle.jdbc.driver.OracleDriver
)。
以下是我的代码。
老工人阶级:
package mypath.helpers;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBHelper {
public static Connection getDatabaseConnection(){
String dbClass = "oracle.jdbc.driver.OracleDriver";
String dbUrl = "jdbc:oracle:thin:@host:port/service";
String dbUser = "user";
String dbPass = "pass";
// connect to DB
try {
Class.forName(dbClass);
Connection con = DriverManager.getConnection(dbUrl, dbUser, dbPass);
con.setAutoCommit(false);
return con;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
新的非工薪阶层:
package mypath.helpers;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class PropertyParser extends Properties{
// variables
private static String propFile = "conf/myprops.properties";
private static String dbClassProp = "DBCLASS";
private static String dbUrlProp = "DBURL";
private static String dbUserProp = "DBUSER";
private static String dbPassProp = "DBPASS";
// constructor
public PropertyParser() throws FileNotFoundException, IOException{
super();
this.load(new FileInputStream(propFile));
}
public Connection getDBConnection() throws SQLException, ClassNotFoundException{
// read properties
String JDBCClass = this.getProperty(dbClassProp).trim() ;
String JDBCUrl = this.getProperty(dbUrlProp).trim();
String JDBCUserId = this.getProperty(dbUserProp).trim();
String JDBCPasswd = this.getProperty(dbPassProp).trim();
Class.forName(JDBCClass);
Connection con = DriverManager.getConnection(JDBCUrl, JDBCUserId, JDBCPasswd);
con.setAutoCommit(false);
return con;
}
}
这是主要的,两个电话:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException, SQLException {
// this works fine
Connection con = DBHelper.getDatabaseConnection();
System.out.println("Everything works fine till now.");
// this does not work
PropertyParser pp = new PropertyParser();
Connection con2 = pp.getDBConnection();
System.out.println("I will never reach this point.");
}
这是我得到的输出:
Everything works fine till now.
Exception in thread "main" java.lang.ClassNotFoundException: "oracle.jdbc.driver.OracleDriver"
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at mypath.helpers.PropertyParser.getDBConnection(PropertyParser.java:35)
at mypath.GetConnection.main(GetConnection.java:20)
ojdbc.jar文件在项目的构建路径中配置。有没有办法完成结果?
答案 0 :(得分:1)
问题显示在预期信息中:
线程“main”中的异常java.lang.ClassNotFoundException:“oracle.jdbc.driver.OracleDriver”
如果我写
Class.forName("HelloWorld");
我收到以下异常消息:
线程“main”中的异常java.lang.ClassNotFoundException: HelloWorld
不知何故,您的属性文件不包含类名,而是包含在引号中的类名。
删除这些引号并使用您的代码。
答案 1 :(得分:1)
双引号。 您不必在属性值中加上双引号。
所以它:
DBCLASS=oracle.jdbc.driver.OracleDriver
而不是
DBCLASS="oracle.jdbc.driver.OracleDriver"
答案 2 :(得分:0)
查看oracle.jdbc.driver.OracleDriver
中是否有ojdbc.jar
个课程。
以简单的方式,它是具有完全限定名称oracle.jdbc.driver.OracleDriver
的类的导入,并且看它是否在您的日食中报告错误。