Добавление значений в таблицу базы данных только один раз - PullRequest
1 голос
/ 05 июня 2019

Мне нужно создать приложение корзины в Spring MVC. У меня есть эта таблица cartentries в базе данных, где я храню book_id, id_cartEntry и другие поля. Также у меня есть пользовательская таблица, где я храню id_user. У меня есть похожие записи в моих корзинах, и когда я нажимаю кнопку оформления заказа, эти записи должны быть загружены в таблицу корзины. Проблема в том, что я не знаю, как сохранить поле id_user в переменной, поэтому мне не нужно иметь следующую строку кода:

while (resultSet2.next()) 

Это заставляет мой код выполняться только один раз, так что в таблицу корзины загружается только одна запись из карт. Это потому, что resultSet2 больше не находит новых пользователей в таблице, потому что я вошел в систему как один пользователь. Как мне сделать так, чтобы все данные из картотеки попали в таблицу корзины?

Это функция:

   @RequestMapping("/checkout")
    public void checkout(@RequestParam String username) {
        System.out.println("this is checkout from book controller");
        System.out.println("username is " + username);
        Connection connection = ConnectToDatabase.createConnection();
        try {
            PreparedStatement preparedStatement = connection.prepareStatement("select * from cartentries");
            ResultSet resultSet = preparedStatement.executeQuery();

            PreparedStatement preparedStatement2 = connection.prepareStatement("select id_user from user where username='" + username + "'");
            ResultSet resultSet2 = preparedStatement2.executeQuery();
            while (resultSet.next()) {
                while (resultSet2.next()) {
                    PreparedStatement preparedStatement1 = connection.prepareStatement("INSERT INTO cart(id_user,id_cartEntry,totalPrice)VALUES(?,?,?)");
                    preparedStatement1.setInt(1,resultSet2.getInt("id_user"));
                    preparedStatement1.setInt(2, resultSet.getInt("id_cartEntry"));
                    preparedStatement1.setInt(3, resultSet.getInt("totalPrice"));
                    preparedStatement1.executeUpdate();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

1 Ответ

0 голосов
/ 05 июня 2019

Я изменил ваш код, чтобы "хранить" идентификатор пользователя, если он был найден.

    try {
        PreparedStatement preparedStatement = connection.prepareStatement("select * from cartentries");
        ResultSet resultSet = preparedStatement.executeQuery();

        PreparedStatement preparedStatement2 = connection.prepareStatement("select id_user from user where username=?");

        preparedStatement2.setString(1, username);
        ResultSet resultSet2 = preparedStatement2.executeQuery();


        PreparedStatement preparedStatement1 = connection.prepareStatement("INSERT INTO cart(id_user,id_cartEntry,totalPrice)VALUES(?,?,?)");

        Integer userId;
        if (resultSet2.next()) {
            // guess it found at least one user
            userId = resultSet2.getInt("id_user");
        }

        if (userId != null) {
            while (resultSet.next()) {
                preparedStatement1.setInt(1, userId);
                preparedStatement1.setInt(2, resultSet.getInt("id_cartEntry"));
                preparedStatement1.setInt(3, resultSet.getInt("totalPrice"));
                preparedStatement1.executeUpdate();
            }
        }


    } catch (Exception e) {
        e.printStackTrace();
    }

Я также изменил ваш запрос имени пользователя, чтобы использовать setString вместо конкатенации.См. SQLInjection

Возможно, вы можете преобразовать эти операторы в отдельные методы для лучшего чтения кода.

PS.Не забудьте добавить предложение finally и закрыть соединение (или попробовать с ресурсами), чтобы предотвратить утечку ресурса на сервере базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...