【问题标题】:executeUpdate(String sql) Method in Statement Class with a insert query which has ON DUPLICATE KEY UPDATE语句类中的 executeUpdate(String sql) 方法,其中插入查询具有 ON DUPLICATE KEY UPDATE
【发布时间】:2014-08-24 17:17:11
【问题描述】:

我正在我的 net beans java 应用程序中执行插入查询。

public boolean Update(){
    String sql="insert into customer(cNic,cName,cAddress,cTp,cEmail,creditLimit,CustomerStatus)"
            + "values('"+cs.getcNic()+"','"+cs.getcName()+"','"+cs.getcAddress()+"','"+cs.getcTp()+"'"
            + ",'"+cs.getcEmail()+"','"+cs.getCreditLimit()+"',0) "
          + "ON DUPLICATE KEY UPDATE cName=VALUES(cName), cAddress=VALUES(cAddress), "
            + "cTp=VALUES(cTp), cEmail=VALUES(cEmail), \n" +
                "creditLimit=VALUES(creditLimit),CustomerStatus=0;";
    try {
        Statement stmt=dbConn.createStatement();
        int rslt =stmt.executeUpdate(sql);
        if(rslt==1){
            return true;
        }
        else{
            return false;
        }
    } 
    catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, ex, "DB_CONNECTION ERROR", JOptionPane.ERROR_MESSAGE);
        return false;
    }

}

此方法适用于新行。 但是当我添加一行(表中已有主键)时,stmt.executeUpdate(sql) 方法返回 2。但表中的数据已更新。但我无法检查插入是否成功。在正常情况下,如果执行成功,它会返回 1。有没有办法在 net beans 中执行此查询并知道它是否已正确更新。

【问题讨论】:

    标签: java mysql sql netbeans


    【解决方案1】:

    首先请帮我一个忙,用 PreparedStatement 替换 Statement

    executeUpdate()- 返回 SQL 数据操作语言 (DML) 语句的行数

    method returns 2 表示两行受到影响

    But I can't check whether the insertion has been done successfully

    如果没有插入它会返回 0 或抛出异常

    【讨论】:

      【解决方案2】:

      没错,您不需要将 stmt.executeUpdate() 函数保存为 int。 如果更新成功,它将起作用并且您可以返回true(假设您希望它返回true,如果它起作用),否则如果抛出异常就是这种情况,您的代码会导致catch子句,因此将返回假的;

      我建议你重写你的方法,我会用我的一段代码给你一个例子:

      public boolean update(Long id) throws SQLException{
              Statement stmt = dbCon.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,     ResultSet.CONCUR_UPDATABLE);
             String allRoomsToArchive = String.format("Update Room SET "
                      + "archive=1 WHERE building_id=%s;",id);
              stmt.executeUpdate(allRoomsToArchive);
      
      // You always need to close your statements and connections, as for security reasons, and // also because sometimes, you will have too many connections, so that your query can not // be done. A connection does not automatically close after your statement has finished!
      
      stmt.close();
      dbCon.close();
      
      
      }
      

      这种方式的优点是您可以从另一个方法调用您的更新方法,例如callUpdate() 并在那里处理异常。 如果您必须执行许多 sql 查询,您可以将它们放在一个队列中,并且只需像这里一样使用 try catch 处理它一次,但如果它是您唯一的一个,那么它看起来更流畅:

      public boolean callUpdate(){
      
      
      try{
       update();
       // update2();
       // update3();
      
       return true;
      }catch(SQLException e){
       System.out.println(e.toString());
       return false;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-23
        • 2011-02-12
        • 2014-10-18
        • 2017-06-29
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多