我目前正在根据Spring Boot应用程序客户端的输入,通过executeUpdate
向PostgreSQL数据库添加数据。我使用java方法中的以下代码将comment
,longitude
,latitude
,address
和username
添加到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
我在这里做错了吗?
答案 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()显式提交事务。