java中的ExecuteUpdate成功地将记录添加到PostgreSQL,但表不会更新

时间:2018-04-25 15:40:31

标签: java postgresql spring-boot

我目前正在根据Spring Boot应用程序客户端的输入,通过executeUpdate向PostgreSQL数据库添加数据。我使用java方法中的以下代码将commentlongitudelatitudeaddressusername添加到Review表中。

我使用以下行在控制器类中的方法中传递信息:

addReviewMethod.addReview( comment,  longitude,  latitude,  address,  username);

这会将数据传递给另一个java类并将其插入到表中,如下所示:

public void addReview(String comment, double longitude, double latitude, String address, String username) {

    Connection c = null;
    Statement stmt = null;

    try {
         Class.forName("org.postgresql.Driver");
         c = DriverManager
            .getConnection("jdbc:postgresql://localhost:5432/arearatingpgdb",
            "postgres", "root");
         c.setAutoCommit(false);

         stmt = c.createStatement();
         int rs = stmt.executeUpdate( "INSERT INTO reviews VALUES (nextval('reviews_id_seq'::regclass), '" +comment +" '," +longitude+"," +latitude+", '"+address+"', '"+username+"');" );

         System.out.println("Successfully added: " +  comment + longitude + latitude + address + username);
        /* while ( rs.next() ) {
            Review  review = rs.getDouble("price");
            System.out.println();
            housePrices.add(price);
         }*/
         //rs.close();
         stmt.close();
         c.close();
      } catch ( Exception e ) {
         System.err.println( e.getClass().getName()+": "+ e.getMessage() );
         System.exit(0);
      }
}

我在控制器类和执行插入的类中都包含了打印调试器,并且它们打印了正确的信息,这些信息向我显示每个人都正常工作。

我遇到的问题是,当我查看表格的内容,即pgAdmin4中的select * from reviews时,表格中的唯一行就是我已经硬编码的行。当我更加容易混淆时通过查询工具将另一行硬编码到表中,id列反映实际已经从java端添加了行但它们没有显示在表中。例如,我硬编码为2行,然后我尝试运行方法4次然后我在另外2行硬编码,数据库看起来像这样。

 id | val 
----+-----
  1 | foo
  2 | bar
  6 | foo
  7 | bar

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

你必须提交这些更改。

c.commit()之前stmt.close()c.setAutoCommit(false);改为c.setAutoCommit(true);

答案 1 :(得分:0)

默认情况下,Java中的连接是自动提交。在您的代码中,您故意将连接的自动提交设置为false。您可以通过两种方式修复代码:

  • 在下面注释代码段

    c.setAutoCommit(假);

  • 在结束声明之前提交您的更改

    c.commit();

答案 2 :(得分:0)

您必须在关闭Connection对象之前添加c.commit()。因为此语句将永久刷新您对数据库的更改。 setAutoCommit(false)更改了隐式事务提交的行为,并且需要使用commit()显式提交事务。