Как выбрать строку и обновить ее на Java? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь написать 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 показывает правильно в консоли, но не обновляется в базе данных.Что я делаю не так?

1 Ответ

1 голос
/ 19 апреля 2019

Первое: не использовать конкатенацию для ввода параметров.Это склонно к SQL-инъекции .

Второе: какую СУБД вы используете?Это обновление можно выполнить одним запросом, используя оператор 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();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...