在购物车结帐后从 JavaFX 更新 MySQL 中的多条记录

UPDATE Multiple records in MySQL from JavaFX after checkout in Cart

我有一个购物车页面,用户可以在购买 products/medicines 后结账。我在该页面上有一个名为结帐的按钮。单击该按钮“CheckOut”后,我想在单击该按钮后从 JavaFX 更新 MySQL 中的多条记录。我希望 table 视图中每个 item/medicine 的数量根据购买的数量减少。我尝试将查询放入 for 循环中,我尝试从 table 视图中选择 selectAll。我将提供我编写的代码和带有按钮的 JavaFX tableView 的屏幕截图。任何帮助表示赞赏。感谢您从现在开始的时间和合作。

package Patient;

import Admin.Doctor.AddDoctor;
import com.jfoenix.controls.JFXButton;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;


import java.sql.PreparedStatement;

import static Admin.AdminLogin.rightDown;
import static Connection.DBConnection.*;
import static sample.ChoicePage.scene;

public class CompletePurchase
{
    private StackPane tablePane;
    private TableView<Cart> cartTableView;

    private JFXButton remove;
    private JFXButton complete;

    public void complete()
    {
        rightDown.getChildren().clear();

        new AddDoctor().back();

        tablePane = new StackPane();
        tablePane.setMinWidth(700);
        tablePane.setMinHeight(500);
        tablePane.setLayoutY(90);
        tablePane.setLayoutX(150);

        tablePane.getChildren().clear();

        remove = new JFXButton("REMOVE");
        remove.setPrefWidth(200);
        remove.setPrefHeight(35);
        remove.setLayoutX(300);
        remove.setLayoutY(600);
        remove.getStyleClass().add("loginButton");
        remove.setOnAction((e)->{
            try
            {
                Cart cart = cartTableView.getSelectionModel().getSelectedItem();

                String removeQuery = "DELETE FROM Cart WHERE MedicineID = ?";
                preparedStatement = connection.prepareStatement(removeQuery);
                preparedStatement.setString(1,cart.getMedicineID());
                preparedStatement.executeUpdate();
                preparedStatement.close();

                cartTableView.getItems().removeAll(cartTableView.getSelectionModel().getSelectedItem());
            }
            catch(Exception e1)
            {
                e1.printStackTrace();
            }
        });
        rightDown.getChildren().add(remove);

        complete = new JFXButton("CHECKOUT");
        complete.setPrefWidth(200);
        complete.setPrefHeight(35);
        complete.setLayoutX(600);
        complete.setLayoutY(600);
        complete.getStyleClass().add("loginButton");
        complete.setOnAction((e)->{
            try
            {
                cartTableView.getSelectionModel().selectAll();
                int num = cartTableView.getItems().size();
                Cart cart = cartTableView.getSelectionModel().getSelectedItem();

                String updateQuery = "UPDATE Medicine SET Quantity = Quantity - ? WHERE MedicineID = ?";
                preparedStatement = connection.prepareStatement(updateQuery);
                preparedStatement.setString(1,cart.getQuantity());
                preparedStatement.setString(2,cart.getMedicineID());

                preparedStatement.executeUpdate();
                preparedStatement.close();
            }

            catch(Exception e1)
            {
                e1.printStackTrace();
            }
        });
        rightDown.getChildren().add(complete);

        ObservableList<Cart> cartObservableList = FXCollections.observableArrayList();

        TableColumn<Cart,String> PatientID = new TableColumn<>("PATIENT ID");
        PatientID.setCellValueFactory(new PropertyValueFactory<>("PatientID"));
        PatientID.setPrefWidth(116);

        TableColumn<Cart,String> MedicineID = new TableColumn<>("MEDICINE ID");
        MedicineID.setCellValueFactory(new PropertyValueFactory<>("MedicineID"));
        MedicineID.setPrefWidth(116);

        TableColumn<Cart,String> MedicineName = new TableColumn<>("MEDICINE NAME");
        MedicineName.setCellValueFactory(new PropertyValueFactory<>("MedicineName"));
        MedicineName.setPrefWidth(116);

        TableColumn<Cart,String> Price = new TableColumn<>("PRICE");
        Price.setCellValueFactory(new PropertyValueFactory<>("Price"));
        Price.setPrefWidth(116);

        TableColumn<Cart,String> Quantity = new TableColumn<>("QUANTITY");
        Quantity.setCellValueFactory(new PropertyValueFactory<>("Quantity"));
        Quantity.setPrefWidth(116);

        TableColumn<Cart,String> TotalPrice = new TableColumn<>("TOTAL PRICE");
        TotalPrice.setCellValueFactory(new PropertyValueFactory<>("TotalPrice"));
        TotalPrice.setPrefWidth(116);

        try
        {
            resultSet = connection.createStatement().executeQuery("SELECT * FROM Cart");

            while (resultSet.next())
            {
                cartObservableList.add(new Cart(
                        resultSet.getString("PatientID"),
                        resultSet.getString("MedicineID"),
                        resultSet.getString("MedicineName"),
                        resultSet.getString("Price"),
                        resultSet.getString("Quantity"),
                        resultSet.getString("TotalPrice")
                ));
            }
        }

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

        cartTableView = new TableView<>();
        cartTableView.getColumns().addAll(PatientID,MedicineID,MedicineName,Price,Quantity,TotalPrice);
        cartTableView.setItems(cartObservableList);
        cartTableView.getSelectionModel().setSelectionMode(
                SelectionMode.MULTIPLE
        );

        cartTableView.setMinWidth(700);
        cartTableView.setMinHeight(500);
        cartTableView.setLayoutY(0);
        cartTableView.setLayoutX(0);

        tablePane.getChildren().add(cartTableView);
        rightDown.getChildren().addAll(tablePane);

        scene.getStylesheets().add("Admin/Doctor/AddDoctor.css");
    }
}



购物车的屏幕截图

因为您正在使用 PreparedStatement 所以你可以使用 addBatch() 方法,它在内部存储所有查询并组合执行它们,而不是像你在循环中所做的那样一个一个地执行。

此外,这里使用事务是很好的。 您可以在批处理的开头使用适当的 begin transaction 命令,然后添加所有相关查询,在您的情况下更新查询,然后最后添加 commit command 然后执行它。对于任何类型的错误,所有更新都将回滚,如果更新成功,您的查询将立即执行,您不需要使用任何循环来逐个执行查询

这是一篇文章 PreparedStatememt Batchs

检查这个标题PreparedStatement Batch Updates

希望你的问题早日得到解决