Java 只向数据库表添加一次值

Java 只向数据库表添加一次值,java,spring,model-view-controller,Java,Spring,Model View Controller,我必须在SpringMVC中创建一个购物车应用程序。 我在数据库中有这个carentries表,我在其中存储book\u id、id\u carentry和其他字段。我还有一个用户表,在那里我存储id\u user。我的cartentries中有类似的条目,当我单击checkout按钮时,这些条目必须加载到cart表中。 问题是我不知道如何将id_user字段存储到变量中,这样我就不必有这行代码: while (resultSet2.next()) 这使得我的代码只执行一次,这样carten

我必须在SpringMVC中创建一个购物车应用程序。 我在数据库中有这个carentries表,我在其中存储book\u id、id\u carentry和其他字段。我还有一个用户表,在那里我存储id\u user。我的cartentries中有类似的条目,当我单击checkout按钮时,这些条目必须加载到cart表中。 问题是我不知道如何将id_user字段存储到变量中,这样我就不必有这行代码:

while (resultSet2.next()) 
这使得我的代码只执行一次,这样cartentries中只有一个条目被加载到cart表中。这是因为resultSet2在表中找不到任何新用户,因为我已登录到单个用户。如何使cartentries中的所有数据进入cart表

这就是功能:

   @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();
        }

    }
我已将您的代码更改为“存储”用户标识(如果找到)

    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();
    }
我还将您的userid查询更改为使用setString而不是串联。参见SQLInjection

也许您可以将这些语句重构为单独的方法,以便更好地阅读代码

另外,不要忘记添加finally子句并关闭连接(或try with resources),以防止数据库服务器上的资源泄漏。

如果找到了用户ID,我已将您的代码更改为“存储”

    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();
    }
我还将您的userid查询更改为使用setString而不是串联。参见SQLInjection

也许您可以将这些语句重构为单独的方法,以便更好地阅读代码


另外,不要忘记添加finally子句并关闭连接(或try with resources),以防止数据库服务器上的资源泄漏。

…为什么不使用JPA!!你可以一次完成shot@YCF_L我该怎么做?@YCF\L也许他是从Java开始的+1 Hibernate/JPA方式。@admlz635,我不知道如何使用它们,我只想要这个简单的东西。。。要获取用户名的id并将其存储到变量中,以便我可以将数据插入购物车表……为什么不使用JPA!!你可以一次完成shot@YCF_L我该怎么做?@YCF\L也许他是从Java开始的+1 Hibernate/JPA方式。@admlz635,我不知道如何使用它们,我只想要这个简单的东西。。。获取用户名的id并将其存储到变量中,以便我可以将数据插入购物车表中…谢谢@admlz635!在插入cart表之前,如何在cart表中检查重复项?在Carentries表中插入之前,您可以检查重复项吗?我的意思是,为什么你可以在那张表上有重复的条目?@admIz635,好吧,签出功能链接到一个按钮,这就是为什么它会在多次按下按钮时创建重复项。这就是为什么我需要在cart表中检查重复项的原因。我认为您可以在执行插入的函数/方法中进行检查,如果项目已经在cart中,则不执行任何操作,否则插入它。可能会添加一个数量字段(在Carentries上)?这样无论你按下按钮多少次,如果该商品在购物车中,只需在数量字段上执行+1即可。谢谢@admlz635!在插入cart表之前,如何在cart表中检查重复项?在Carentries表中插入之前,您可以检查重复项吗?我的意思是,为什么你可以在那张表上有重复的条目?@admIz635,好吧,签出功能链接到一个按钮,这就是为什么它会在多次按下按钮时创建重复项。这就是为什么我需要在cart表中检查重复项的原因。我认为您可以在执行插入的函数/方法中进行检查,如果项目已经在cart中,则不执行任何操作,否则插入它。可能会添加一个数量字段(在Carentries上)?这样无论你按下按钮多少次,如果商品在购物车中,只需在数量字段上执行+1即可。