JDBC更新使用预处理语句

时间:2014-10-09 05:21:59

标签: java sqlite jdbc

我正在尝试使用Java JDBC更新表。我使用的方法不会抛出任何错误,但表没有更新。 create table方法如下:

public static void Table()
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
          System.out.println("Opened database successfully");

          stmt = c.createStatement();
          String sql = "CREATE TABLE IF NOT EXISTS CUSTOMERS2 " +
                       "(PHONE TEXT PRIMARY KEY     NOT NULL," +
                       " SURNAME            TEXT    NOT NULL, " + 
                       " FIRSTNAME          TEXT     NOT NULL, " + 
                       " HOME               TEXT, " + 
                       " ADDRESS            TEXT, " + 
                       " POSTCODE           Text)"; 
          stmt.executeUpdate(sql);
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Customers2 created successfully");
      }

更新方法如下:

public static void updateCustomers()
      {
        Connection c = null;
        PreparedStatement pstmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");

          String query = "UPDATE CUSTOMERS2 set ADDRESS = ? where PHONE = ? ";
          pstmt = c.prepareStatement(query); // create a statement
          pstmt.setString(1, "1"); // set input parameter 1
          pstmt.setString(2, "DOES THIS WORK"); // set input parameter 2
          pstmt.executeUpdate(); // execute update statement

          pstmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Update Completed successfully HELLO");
      }

我试图找到一些明确的指示,但无法找到。我不太了解JDBC和准备好的陈述

3 个答案:

答案 0 :(得分:2)

autoCommitfalsec.setAutoCommit(false);)时,您必须手动提交交易......

添加...

c.commit()

pstmt.executeUpdate();之后

您的代码也存在缺陷,因为如果在准备或执行语句期间发生某种错误,ConnectionPreparedStatement都可能会保持打开状态,导致资源泄漏< / p>

如果您使用的是Java 7+,则可以使用try-with-resources功能,例如......

try {
    Class.forName("org.sqlite.JDBC");
    try (Connection c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db")) {
        c.setAutoCommit(false);
        System.out.println("Opened database successfully");

        String query = "UPDATE CUSTOMERS2 set ADDRESS = ? where PHONE = ? ";
        try (PreparedStatement pstmt = c.prepareStatement(query)) {
            pstmt.setString(1, "1"); // set input parameter 1
            pstmt.setString(2, "DOES THIS WORK"); // set input parameter 2
            pstmt.executeUpdate(); // execute update statement
            c.commit();
        }

    } catch (SQLException exp) {
        exp.printStackTrace();
    }
} catch (ClassNotFoundException exp) {
    exp.printStackTrace();
    System.out.println("Failed to load driver");
}

这将确保无论您如何离开try块,资源都将被关闭。

您也可以考虑查看JDBC(TM) Database Access

答案 1 :(得分:0)

如果表中有任何行,则您的更新方法会将ADDRESS设置为1,并且PHONE =这样做。

尝试将Address放入1st Input参数和Phone 2nd Input参数

答案 2 :(得分:0)

创建连接时,它处于自动提交模式。 只有当我们需要将Auto Commit设置为false并且在执行查询后使其手动提交时,我们才需要使用[setAutoCommit]方法。

JDBC Transaction上的Oracle网站上提供了更多详细信息。