Java 无错误,但数据不存在';不要插入表中

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

在我的数据库中,我有两个名为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.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操作以及任何应用程序(尤其是企业应用程序)的标准方法。快乐编码!!