mysql - 当我添加表中已存在的产品时,数据库中的数量值未更新

标签 mysql servlets jdbc

我有一个“shopping_cart”表,其中包含用户订购的所有产品。该表有一个“数量”列,其中保存用户在购物车中添加特定产品的次数。如果用户在同一产品上第二次单击“添加到购物车”按钮,则新的数量值应该是旧的数量值 + 1。出于某种原因(我认为这很愚蠢),整个逻辑不起作用。数量始终为 1。

所以,我有一个产品列表,每个产品都有一个“添加到购物车”按钮,单击该按钮时,它会向 CartController servlet 发送请求,该 servlet 从访问数据库的 CartDAO 调用 addToCart() 方法并插入产品。在 CartDAO 文件中,方法 addToCart() 是一个 bool 值,如果插入了产品则返回 True,如果表中已存在则返回 False。正如您从下面的代码中看到的,第一个“if”检查行是否已更新,如果没有(意味着产品已经存在并且查询返回错误),它会进入“else”语句,该语句应该理论上,仅返回包含添加产品的表中的行,然后从该行的数量列中获取“数量”值,然后用 +1 更新它。由于某种原因,这不会发生。我已经检查了所有查询,并且 100% 确定它们具有有效的语法,我也知道产品确实已添加到购物车,因此 addToCart 方法的逻辑部分有效。我已经阅读了 ResultSet 对象的 javadoc,据此,一切都应该正常工作,因为我将光标指向 resultSet 的第一行,无论如何它只包含一行。帮助

这是当产品添加到购物车时访问的 CartController servlet 的 post 方法(抱歉,缺少语法突出显示,我不知道该怎么做):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Integer productID = Integer.parseInt(request.getParameter("productID"));
        String fk_username = (String)session.getAttribute("username");
        String productName = request.getParameter("productName");
        String productPrice = request.getParameter("productPrice");
        Integer productPriceSup = Integer.parseInt(request.getParameter("productPriceSup"));
        String productImage = request.getParameter("productImage");

        if(dao.addToCart(productID, fk_username, productName, productPrice, productPriceSup, productImage)) {       
            response.sendRedirect("processors.jsp");
        }else {
            String error3 ="Please try again later";
            request.setAttribute("error3", error3);
            request.getRequestDispatcher("processors.jsp").forward(request, response);
        }           
    }

这是与问题相关的 CartDAO 代码:

public class CartDAO {
    String sql ="insert into shopping_cart(P_ID, fk_uname, P_name, P_price, P_price_sup, P_image, quantity) values(?,?,?,?,?,?,?)";
    String url = "jdbc:mysql://localhost:3306/WebApp?useSSL=false&serverTimezone=UTC";
    String username="jipa";
    String password="";
    private Statement statement = null;
    private Statement statement2 = null;
    private ResultSet resultSet = null;
    private int quantity=1;

    public boolean addToCart(Integer productID, String fk_username, String productName, String productPrice, Integer productPriceSup, String productImage){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection= DriverManager.getConnection(url, username, password);
            PreparedStatement pstatement= connection.prepareStatement(sql);
            pstatement.setInt(1, productID);
            pstatement.setString(2, fk_username);
            pstatement.setString(3, productName);
            pstatement.setString(4, productPrice);
            pstatement.setInt(5, productPriceSup);
            pstatement.setString(6, productImage);
            pstatement.setInt(7,  quantity);
            if(pstatement.executeUpdate()>0) {
                return true;

            }else {
                String getProduct ="select * from shopping_cart where fk_uname="+"\""+fk_username+"\""+" AND P_ID="+"\""+productID+"\"";
                statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_UPDATABLE); 
                resultSet = statement.executeQuery(getProduct);
                resultSet.absolute(1);
                quantity=(resultSet.getInt("quantity")+1);
                String addQuantity ="update shopping_cart set quantity="+"\""+quantity+"\""+" where P_ID="+"\""+productID+"\""+" AND fk_uname="+"\""+fk_username+"\"";
                statement2 = connection.createStatement(); 
                statement2.executeQuery(addQuantity);
                return true;
            }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;   

    }

代码没有错误,运行得很好。如果我遗漏了一些重要的细节,请告诉我,以便我更新问题。

最佳答案

正如 Strawberry 所说,解决方案是删除整个“else”语句并用以下语句替换初始插入语句:

String sql ="insert into shopping_cart(P_ID, fk_uname, P_name, P_price, P_price_sup, P_image, quantity) values(?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE quantity=quantity+1;";

关于mysql - 当我添加表中已存在的产品时,数据库中的数量值未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57718093/

相关文章:

java - 处理动态数据库连接

mysql - 在 MySQL 中复制行

c# - 组合框不会显示正确的项目

MySQL:在没有 JOIN 或 UNION 的情况下合并两个不同的表

java - 来自mysql数据库的数据JList和ComboBox

java - Java 功能测试

java - 文件在动态增加的文件中查找

java - JDBC 给我参数索引超出范围(1 > 参数数量,即 0)

java - jQuery AJAX GET 到 Servlet 不显示 JSP 页面 - 而是返回 HTML 代码

java - MySQL每次都打开一个新的Statement?