无法将记录插入数据库

Unable to insert records in to database

当我尝试使用准备好的语句插入记录时出现错误:

Registration Servlet INSIDE try block:
Printing USER Values
====================
john
smith
john@gmail.com
john
Connection is: null
username: rth
password: rth
driver: oracle.jdbc.OracleDriver
url is: jdbc:oracle:thin:@localhost:1521:orcl
@@@@Record insertion error in Registration DAO@@@@
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.RTH.commons.DBConnection.getConnection(DBConnection.java:42)
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:29)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@localhost:1521:orcl
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.RTH.commons.DBConnection.getConnection(DBConnection.java:49)
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:29)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
    at com.RTH.DAO.RegistrationDAO.insert(RegistrationDAO.java:31)
    at com.RTH.Registration.RegistrationServlet.doPost(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我能够打印连接详细信息以及属性文件:

public class DBConnection {

    public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException
    {
        Properties props = new Properties();
        props.load(DBConnection.class.getResourceAsStream("DBDetails.properties"));
        String username = props.getProperty("dbusername");
        String password = props.getProperty("dbpassword");
        String driver = props.getProperty("driver");
        String url = props.getProperty("url");
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, username, password);
        System.out.println("Connection is: " + con);
        System.out.println("username: " + username);;
        System.out.println("password: " + password);;
        System.out.println("driver: "+ driver);;
        System.out.println("url is: " + url);;
        return con;
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        DBConnection.getConnection();
    }
}

RegistrationDao 文件:

public class RegistrationDAO {

    public void insert(User user) {

        try {
            System.out.println("Printing USER Values");
            System.out.println("====================");
            System.out.println(user.getFirstName());
            System.out.println(user.getLastName());
            System.out.println(user.getEmail());
            System.out.println(user.getPassword());

            Connection con = DBConnection.getConnection();
            String query = "insert into TBL_USER(USR_FIRST_NAME,USR_LST_NAME,USR_PRIMARY_EMAIL,USR_PASSWORD) values(?,?,?,?)";
            PreparedStatement pst = con.prepareStatement(query);

            pst.setString(1, user.getFirstName()); //prints value
            pst.setString(2, user.getLastName());  //prints value
            pst.setString(3, user.getEmail());     //prints value
            pst.setString(4, user.getPassword());  //prints value
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("@@@@Record insertion error in Registration DAO@@@@");
            e.printStackTrace();
        }
    }
}

属性文件:

dbusername=rth
dbpassword=rth
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl

我已经检查过数据库用户名和密码没有过期并且仍然有效。连接测试成功。所有的列类型都是 varchar2 200 字节。我不确定为什么它仍然抛出错误。

这个问题出现在你异常的第一行:

props.load(DBConnection.class.getResourceAsStream("DBDetails.properties"));

这意味着:文件 "DBDetails.properties" 显然不在当前目录中,也不在 class 路径设置之一中。

检查文件所在的位置并相应地设置 class路径或将其移动到正确的位置。

Q 更新后编辑

与oracle驱动程序相同。 oracle 驱动程序 class 未加载,可能它也不在 class 路径上 - 或者甚至根本不存在(我敢打赌,因为这需要明确地 downloaded/installed来自甲骨文)

java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver

您可以看到 sysout 语句,因为您必须 运行 您 IDE 中的程序,其中属性文件位于您的类路径中。部署应用程序时,您的属性文件不在您的类路径中。

您可以将代码更改为:

props.load(DBConnection.class.getResourceAsStream("../conf/DBDetails.properties"));

创建目录'conf' ||到包含您的代码 (jars) 的 lib 文件夹并尝试 运行 它。

按照这些步骤解决了我的问题:

  1. 从 class 路径中删除 ojdbc6-11.1.0.7.0.jar 并添加 ojdbc6.jar
  2. 更改了 driver 名称:

    driver=oracle.jdbc.OracleDriver driver=oracle.jdbc.driver.OracleDriver

  3. 已将 ojdbc6.jar 文件粘贴到 apache-tomcat-7.0.35-windows-x86\apache-tomcat-7.0.35\lib 文件夹

成功了!!