【问题标题】:Insert a new record inside the Java class [duplicate]在Java类中插入一条新记录[重复]
【发布时间】:2015-06-09 09:19:37
【问题描述】:

我的 Java 类中有这个方法,用于向我的数据库插入一条新记录(一个日期和你的布尔值)。

    private void setTodayInfo(HttpSession session, String date){
    Connection c = null;
    Statement stmt = null;   
    try {         
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:<path>\\myDataBase.sqlite");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");
      String sql = "INSERT INTO IsSELECTED VALUES ('"+date+"', 'FALSE', 'FALSE', 'FALSE')";
      stmt.executeUpdate(sql);
      c.close();


    }catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Operation done successfully");
}

但它不起作用。查询是正确的,因为如果我在 SQL 控制台中执行它,插入就会发生。

编辑:我删除了你说的c.setAutoCommit(false);,但我仍然没有结果..

            Opened database successfully
java.lang.NullPointerException: null
09-Jun-2015 12:36:08.837 INFO [Thread-5] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8084"]
09-Jun-2015 12:36:08.888 INFO [Thread-5] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
09-Jun-2015 12:36:08.938 INFO [Thread-5] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina
09-Jun-2015 12:36:11.104 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [WorkplanMaker] registered the JDBC driver [org.sqlite.JDBC] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
09-Jun-2015 12:36:11.105 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [WorkplanMaker] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation. Stack trace of request processing thread:
 java.lang.Object.wait(Native Method)
 java.lang.Thread.join(Thread.java:1260)
 java.lang.Thread.join(Thread.java:1334)
 java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106)
 java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
 java.lang.Shutdown.runHooks(Shutdown.java:123)
 java.lang.Shutdown.sequence(Shutdown.java:167)
 java.lang.Shutdown.exit(Shutdown.java:212)
 java.lang.Runtime.exit(Runtime.java:109)
 java.lang.System.exit(System.java:961)
 dev.com.WorkplanMakerControlRoom.WorkplanMakerServlet.setTodayInfo(WorkplanMakerServlet.java:192)
 dev.com.WorkplanMakerControlRoom.WorkplanMakerServlet.processRequest(WorkplanMakerServlet.java:34)
 dev.com.WorkplanMakerControlRoom.WorkplanMakerServlet.doGet(WorkplanMakerServlet.java:447)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 org.apache.tomcat.util.threads.TaskThread$Wrappindevunnable.run(TaskThread.java:61)
 java.lang.Thread.run(Thread.java:724)
09-Jun-2015 12:36:11.113 INFO [Thread-5] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8084"

【问题讨论】:

  • 任何错误堆栈跟踪?
  • 在关闭前删除c.setAutoCommit(false);或添加c.commit()。
  • 你没有给stmt分配任何东西所以得到一个NPE。
  • 你真的应该阅读如何正确使用PreparedStatement。永远不要以你的方式组装 SQL!

标签: java mysql jdbc sql-insert


【解决方案1】:

在连接关闭之前删除c.setAutoCommit(false); 或添加c.commit();。

您的语句对象是null。

stmt = connection.createStatement(); // creating statement object.
stmt.executeUpdate(sql);

注意:开始使用PreparedStatement而不是Statement,并尽量避免sql injection。

【讨论】:

  • 我删除了 c.setAutoCommit(false);正如你所说,但我仍然没有结果。
  • 问题是关于 NPE!
  • 更新了我解决 NPE 的答案。
  • 谢谢!我是新手。我会搜索PreparedStatement 来使用它们!
  • @yaylitzis,你可以参考这个mkyong.com/jdbc/…
【解决方案2】:

您将 autocommmit 设置为 false,但没有手动提交。

【讨论】:

  • 我删除了 c.setAutoCommit(false);正如你所说,但我仍然没有结果。
【解决方案3】:

stmt 为空。

在 stmt.executeUpdate(sql);

之前插入 stmt = c.createStatement();

【讨论】:

    【解决方案4】:

    您永远不会提交您的交易。 在关闭连接之前尝试 c.commit();。

    编辑:

    stmt 为空。

    在 stmt.executeUpdate(sql);

    之前插入 stmt = c.createStatement();

    【讨论】:

    • 我删除了 c.setAutoCommit(false);正如你所说,但我仍然没有结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多