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

问题描述 投票:0回答:3

我目前正在通过executeUpdate根据Spring Boot应用程序客户端的输入向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

我在这里做错了吗?

java postgresql spring-boot
3个回答
1
投票

你必须提交这些改变。

所以在c.commit()之前做stmt.close()或者只是将c.setAutoCommit(false);改为c.setAutoCommit(true);


0
投票

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

  • 在下面的代码段中注释掉 c.setAutoCommit(假);
  • 在结束陈述之前提交您的更改 c.commit();

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.