Java 无错误,但数据不存在';不要插入表中
在我的数据库中,我有两个名为car和ad的表。在car中,我有一个外键引用ad中的adId值。当我运行代码时,我没有得到任何错误,但数据只插入到ad中,而不是插入到car中。有什么建议吗?这是我的密码:Java 无错误,但数据不存在';不要插入表中,java,postgresql,Java,Postgresql,在我的数据库中,我有两个名为car和ad的表。在car中,我有一个外键引用ad中的adId值。当我运行代码时,我没有得到任何错误,但数据只插入到ad中,而不是插入到car中。有什么建议吗?这是我的密码: public void createAd(Ad ad, Car car) { try { Class.forName("org.postgresql.Driver"); if (con != null) { ps = con.pre
public void createAd(Ad ad, Car car) {
try {
Class.forName("org.postgresql.Driver");
if (con != null) {
ps = con.prepareStatement("INSERT INTO \"ad\"(\"title\", \"description\", \"author\", \"image\") VALUES (?, ?, ?, ?)");
ps.setString(1, ad.getTitle());
ps.setString(2, ad.getDescription());
ps.setString(3, ad.getAuthor());
ps.setBytes(4, ad.getImage());
ps.executeQuery();
ps = con.prepareStatement("SELECT currval('\"ad_adId_seq\"');");
rs = ps.executeQuery();
rs.next();
int adId = rs.getInt("currval");
ps = con.prepareStatement("INSERT INTO \"ad\"(\"adId\") VALUES (?);");
ps.setInt(1, adId);
ps.executeUpdate();
ad.setAdId(adId);
ps = con.prepareStatement("INSERT INTO \"car\"(\"distanceTraveled\", \"age\", \"condition\", \"vin\", \"brand\", \"price\", \"ad_adId\") VALUES (?, ?, ?, ?, ?, ?, ?)");
ps.setInt(1, car.getDistanceTraveled());
ps.setInt(2, car.getAge());
ps.setString(3, car.getCondition());
ps.setString(4, car.getVIN());
ps.setString(5, car.getBrand());
ps.setInt(6, car.getPrice());
ps.setInt(6, adId);
ps.executeQuery();
car.setAdId(adId);
}
} catch (Exception ex) {
System.out.println(ex);
}
}
上一次查询中有错误:
ps.setInt(7, adId);
而不是
ps.setInt(6, adId);
我建议你去看看。使用将减少大量的
JDBC
boiler-plate代码,更重要的是将为您解决大量JDBC连接泄漏问题
如果需要使用普通的JDBC
,则在使用update语句时,需要正确初始化连接对象并使用update
而不是query
您还需要正确关闭创建的语句
对象。
您应该执行类似于以下代码的操作:
Connection con = null;
PrepareStatement ps1 = null;
PrepareStatement ps2 = null;
PrepareStatement ps3 = null;
PrepareStatement ps4 = null;
ResultSet rs = null;
String url = "jdbc:postgresql://localhost/dbName";
String user = "userName";
String password = "userPass";
try {
con = DriverManager.getConnection(url, user, password);
ps1 = con.prepareStatement("INSERT INTO \"ad\"(\"title\", \"description\", \"author\", \"image\") VALUES (?, ?, ?, ?)");
ps1.setString(1, ad.getTitle());
ps1.setString(2, ad.getDescription());
ps1.setString(3, ad.getAuthor());
ps1.setBytes(4, ad.getImage());
ps1.executeUpdate();
ps2 = con.prepareStatement("SELECT currval('\"ad_adId_seq\"');");
rs = ps2.executeQuery();
if(rs.next())
int adId = rs.getInt("currval");
}
ps3 = con.prepareStatement("INSERT INTO \"ad\"(\"adId\") VALUES (?);");
ps3.setInt(1, adId);
ps3.executeUpdate();
ad.setAdId(adId);
ps4 = con.prepareStatement("INSERT INTO \"car\"(\"distanceTraveled\", \"age\", \"condition\", \"vin\", \"brand\", \"price\", \"ad_adId\") VALUES (?, ?, ?, ?, ?, ?, ?)");
ps4.setInt(1, car.getDistanceTraveled());
ps4.setInt(2, car.getAge());
ps4.setString(3, car.getCondition());
ps4.setString(4, car.getVIN());
ps4.setString(5, car.getBrand());
ps4.setInt(6, car.getPrice());
ps4.setInt(7, adId);
ps4.executeUpdate();
car.setAdId(adId);
} catch (SQLException ex) {
Logger lgr = Logger.getLogger(getClass().getName());
lgr.log(Level.SEVERE, "Unable to execute updates", ex);
} finally {
try {
if (rs != null)
rs.close();
if (ps1 != null)
ps1.close();
if (ps2 != null)
ps2.close();
if (ps3 != null)
ps3.close();
if (ps4 != null)
ps4.close();
if (con != null)
con.close();
} catch (SQLException ex) {
Logger lgr = Logger.getLogger(getClass().getName());
lgr.log(Level.WARNING, "Unable to close the connection", ex);
}
}
另外,您正在使用
ps.executeQuery()
来插入汽车。请尝试ps.executeUpdate()
您的con
对象可能为空。请把你初始化连接的代码也显示出来。天哪,我觉得自己好笨。有时候我想你只是需要一双新鲜的眼睛来看看。我觉得应该可以,以后再试试。非常感谢。没有问题,您应该了解spring、MVC和使用bean。这些是CRUD操作以及任何应用程序(尤其是企业应用程序)的标准方法。快乐编码!!