【问题标题】:Update query not working in preparedStatements Java更新查询在preparedStatements Java中不起作用
【发布时间】:2026-02-20 18:45:01
【问题描述】:

我正在编写这个程序,我在其中使用preparedStatements 对 SQL 数据库进行更改。但是,UPDATE 查询不起作用。

代码如下:

package financials;

import java.net.URL;
import java.util.ResourceBundle;
import java.sql.*;
public void initialize(URL url, ResourceBundle rb) { 
try{
  Class.forName("com.mysql.cj.jdbc.Driver");               
  con=DriverManager.getConnection("jdbc:mysql://localhost/finances","root","P@ssword"); 
  con.setAutoCommit(true);// TODO
   }
catch(Exception ae)
   {
    System.out.println("Error in connection !");       
           
   }
 @FXML
    private void SaveOrAdd(ActionEvent event) {            //This is button which on click executes the following code
        String Action=save.getText();
                    
        if(Action.equals("Add Account"))
        {
          String SBNumber=LinkedSB.getText();
            String newAccountType=AccountTypeF.getText();
            String newFHolder=FHolderF.getText();
            String newSHolder=SHolderF.getText();
            String newTHolder=THolderF.getText();
            String Bankcode=BankCodeF.getText();
            if(newAccountType.equals("")||newFHolder.equals("")||newSHolder.equals("")||newTHolder.equals(""))
            {
                update.setText("Please fill in all the fields !");
            }
            else
            {
            try
            {
                
           
            PreparedStatement pst=con.prepareStatement("INSERT INTO banklines (Bank_Code,Linked_SB_Account,Sb_Account_Type,First_Holder,Second_Holder,Third_Holder) VALUES (?,?,?,?,?,?)");
           
            pst.setString(1,Bankcode);
            pst.setString(2,SBNumber);
            pst.setString(3,newAccountType);
            pst.setString(4,newFHolder);
            pst.setString(5,newSHolder);
            pst.setString(6,newTHolder);
            int a=pst.executeUpdate();
            System.out.println(a);    //This returns a 1

    }
            
            catch(Exception ae)
            {
              update.setText("Update Failed !");
                
            }
            
        }}
        else
        {
            String SBNumber=LinkedSB.getText();
            String newAccountType=AccountTypeF.getText();
            String newFHolder=FHolderF.getText();
            String newSHolder=SHolderF.getText();
            String newTHolder=THolderF.getText();
            String Bankcode=BankCodeF.getText();
            if(newAccountType.equals("")||newFHolder.equals("")||newSHolder.equals("")||newTHolder.equals(""))
            {
                update.setText("Please fill in all the fields !");
            }
            else    //This is the block in concern
            {
            try
            {
 //Here is where the issue starts !               
           
            PreparedStatement pst2=con.prepareStatement("UPDATE banklines SET Sb_Account_Type=?,First_Holder=?,Second_Holder=?,Third_Holder=? WHERE Linked_SB_Account=? AND Bank_Code=?");        
            pst2.setString(1,newAccountType);
            pst2.setString(2,newFHolder);
            pst2.setString(3,newSHolder);
            pst2.setString(4,newTHolder);
            pst2.setString(5,SBNumber);
            pst2.setString(6,Bankcode);
            pst2.executeUpdate();
            int a=pst2.executeUpdate();
            System.out.println(a);        //This returns a 0

            update.setText("Successfully Updated !");

            }
            catch(Exception ae)
            {
              update.setText("Update Failed !");
                
            }
            
        }
    }
}

问题是没有抛出错误,也就是说,输出总是Successfully Updated。但是,这些更改并未反映在数据库上。我尝试在 mySQL 工作台中单独执行查询 UPDATE banklines SET Sb_Account_Type=?,First_Holder=?,Second_Holder=?,Third_Holder=? WHERE Linked_SB_Account=? AND Bank_Code=? 作为查询,它没有返回错误。我还确保没有变量留空。尽管如此,更新仍无法正常工作。更让我困惑的是,if-else 块中的前一个查询,即INSERT 查询完美运行,并且结果也在数据库中更新。 我正在使用带有 jdk 1.8 和 mysql-connector-java-8.0.21 的 NetBeans 8.2。

附:据我所知,我一直坚持使用 java 命名约定,确保我尽可能遵循CamelCase 表示法。如果您觉得有任何问题,请编辑我的代码或提出更改建议。

【问题讨论】:

  • 检查您的表格数据。最有可能的是,如果更新完成没有错误但没有发生任何更改,这是因为 WHERE 子句没有匹配任何记录,或者更新后的新值与更新前的值相同。
  • 您好@TimBiegeleisen,我现在检查了所有内容。我也尝试硬编码不同的值,然后尝试executeUpdate(),但它没有用。感谢您的帮助!
  • 您应该减少字段(要检查的数据更少)并尝试打开交易并关闭它
  • executeUpdate 返回什么值?
  • @Vokail,我对这些技术术语还不是很熟悉,请多多包涵。我又创建了一个项目,只执行了UPDATE 块,它运行良好。我想这表明这没有什么问题。

标签: java mysql


【解决方案1】:

您的插入语句的列名与绑定变量的顺序不匹配,这意味着您插入的记录具有错误的帐户 ID 值。

例如,您将 SBNumber 设置为索引 6,而它应该是:

pst.setString(2,SBNumber);

检查更新更改的行数也是一种很好的做法,以便您可以对您的操作进行进一步的断言/检查:

int rows = pst.executeUpdate();
if (rows != 1) throw new RuntimeException("Failed to update account: "+ SBNumber);

在您的情况下,rows 设置为 0,因为永远找不到要更新的行 - 因为 Linked_SB_Account 不匹配。

【讨论】:

  • 啊,是的,谢谢你指出这一点,我没有注意到:)。但是,我的问题在于 UPDATE 语句,我现在检查它以确保我的变量匹配。
  • 如果插入和更新语句对列 Linked_SB_Account 使用不同的变量,那么更新将永远不会起作用!
  • 好的,我确实按照您的建议进行了更改,但是现在,我遇到了与UPDATE 语句相同的问题,即更新成功。 int a= pst2.executeUpdate() 现在也返回了1,所以我现在比以往任何时候都更加困惑。
  • 返回值 1 表示更新了一行,因此记录应该包含您提供的所有字段值。