首页 > 解决方案 > 如何在 Java 中选择一行并更新它?

问题描述

我正在尝试编写具有数据库连接性的 BankingApp。现在,我正在努力更新用户的余额。用户输入他存入的金额,然后从数据库中取出余额并将金额添加到其中,至少我是这么想的。

我会展示我尝试过的。

编辑:我放了第二个 PreparedStatement 并使用该语句执行了第二个查询,但它仍然无法正常工作。

public void deposit(){

            System.out.println("How much money do u want to deposit?");
            int val = sc.nextInt();
            try {
                String query = "SELECT Balance FROM accounts.accs where AccountNumber =" + 654321 + "";
                Connection con = DriverManager.getConnection(url,username,password);
                PreparedStatement stmt = con.prepareStatement(query);
                ResultSet rs = stmt.executeQuery(query);
                while (rs.next()){
                    int balance = rs.getInt("Balance");
                    System.out.println("test");
                    int updatedBalance = balance+val;
                    System.out.println("the updatetbalance is" + updatedBalance +"");
                    String query2 = "UPDATE accs" +
                            "SET Balance = " + updatedBalance +"" +
                            "WHERE AccountNumber =" + 654321 +"";
                    PreparedStatement stmt2 = con.prepareStatement(query);
                    stmt2.executeUpdate(query2);
                    con.commit();
                }

updatedBalance 在控制台中显示正确,但在数据库中没有更新。我究竟做错了什么?

标签: javajdbc

解决方案


第一件事:不要使用连接输入参数。它很容易发生SQL 注入

第二:您使用的是哪个 DBMS?可以使用update-from-select语句通过单个查询来完成此更新。语法可能因数据库而异,所以我不会给你一个例子,但你绝对应该考虑使用这个选项。您可以在数据库文档中查找它。

最后,这是使用两个PreparedStatement应该适合您的代码:

public void deposit() throws SQLException {

    System.out.println("How much money do u want to deposit?");
    int val = sc.nextInt();
    int accountNumber = 654321;

    String query = "SELECT Balance FROM accounts.accs where AccountNumber = ?";
    try( Connection con = DriverManager.getConnection(url,username,password);
         PreparedStatement stmt = con.prepareStatement(query)) {

        stmt.setInt(1, accountNumber);
        ResultSet rs = stmt.executeQuery();

        String query2 = "UPDATE accs " +
                    "SET Balance = ? " +
                    "WHERE AccountNumber = ?";
        try (PreparedStatement stmt2 = con.prepareStatement(query2)) {
            while (rs.next()){
                int balance = rs.getInt("Balance");
                System.out.println("test");
                int updatedBalance = balance+val;
                System.out.println("the updatetbalance is" + updatedBalance +"");

                stmt2.setInt(1, updatedBalance);
                stmt2.setInt(2, accountNumber);
                stmt2.executeUpdate();
            }
        }
    }
}

推荐阅读