java - 在循环内准备语句

标签 java sql jsp servlets jdbc

我尝试在循环内执行查询。
我正在尝试这段代码:

public List<Products> DisplayProducts(String []a)
{
    ResultSet rs = null;
      List<Products> Data=null;
    try
    {
    for(int i=0;i<a.length;i++)
    {
         String query = "select  * from products where Brand=?";
        PreparedStatement stmt=DataBaseConnection.DBConn.getConnection().prepareStatement(query);
        stmt.setString(1, a[i]);


        rs=stmt.executeQuery();
       }
       if(rs.next())
       {
           rs.beforeFirst();
          Data=new ArrayList<Products>();
       while(rs.next())
       {
           Products p=new Products();
           p.setTitle(rs.getString(2));
           p.setCategory(rs.getString(3));
           p.setSubCategory(rs.getString(4));
           p.setSubCategoryTwo(rs.getString(5));
           p.setPrice(rs.getInt(6));
           p.setFlavour(rs.getString(7));
           p.setImage(rs.getString(8));
           p.setBrand(rs.getString(9));
           p.setInstock(rs.getString(10));
           p.setInstockQty(rs.getInt(11));
           Data.add(p);

       }
       }
       return Data;

}
    catch(Exception e)
    {

        System.out.println(e.getStackTrace());
        return null;
    }

}

我有一个 jsp 页面,其中有复选框,并且我在此页面上显示多个产品。我正在按品牌对此产品进行排序。用户通过选中复选框来选择品牌。

我将复选框的值传递给 servlet,并在该 servlet 上调用函数 Display Products:

String arr[]=request.getParameterValues("On");     
List<Products> Data=new SessionBeanClass().DisplayProducts(arr);

请告诉我如何执行此操作并获得结果?

最佳答案

我想您需要返回所有选中复选框的产品列表。在这种情况下,我想你这里有一个逻辑错误。此方法仅返回最后一条产品记录。 您可以使用“IN”子句并立即返回所有内容,而不是循环遍历不同的 id。有许多不同的方法来实现 IN 子句。下面给出的是一种简单的替代方案。您可以在 http://www.journaldev.com/2521/jdbc-preparedstatement-in-clause-alternative-approaches 中查看各种操作。或http://www.javaranch.com/journal/200510/Journal200510.jsp#a2

除此之外,尝试遵循java命名约定并使用finally清理连接

尝试

public List<Products> DisplayProducts(String[] a) {
        ResultSet rs;
        List<Products> data;
        PreparedStatement stmt;
        try {
            StringBuilder param = new StringBuilder();
            for(String str : a){
                param.append("'").append(str).append("', ");
            }
            String query = "select  * from products where Brand in (" + param.substring(0, param.length() - 2) + ")";
            stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(query);
            rs = stmt.executeQuery();
            if (rs != null) {
                data = new ArrayList<Products>();
                while (rs.next()) {
                    Products p = new Products();
                    p.setTitle(rs.getString(2));
                    p.setCategory(rs.getString(3));
                    p.setSubCategory(rs.getString(4));
                    p.setSubCategoryTwo(rs.getString(5));
                    p.setPrice(rs.getInt(6));
                    p.setFlavour(rs.getString(7));
                    p.setImage(rs.getString(8));
                    p.setBrand(rs.getString(9));
                    p.setInstock(rs.getString(10));
                    p.setInstockQty(rs.getInt(11));
                    data.add(p);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            stmt.close();
        }
        return data;
}

根据评论进行解释

好的。我想你的想法是传递一组品牌名称,如阿迪达斯、耐克等,并选择所有产品详细信息。因此,您需要执行类似 select * from products where Brand in ('adidas', 'nike') 的操作。这将为您提供所有产品。因此,为此,您将选定的品牌名称作为字符串数组传递。所以我所做的就是从数组中获取值并对其进行格式化,并将其作为 IN 子句的参数。因此 IN 子句需要逗号分隔值。由于它是一个 Sting,我们还需要给出单引号 ' 。因此,我需要从数组 [adidas, nike] 构造 'adidas', 'nike'。这就是 for 循环中所做的,附加 ' 和 , (逗号)。因此,在 for 循环之后,我们将在末尾添加一个额外的逗号和空格(例如“adidas”、“nike”、)。为了删除这个,我通过将子字符串作为 param.substring(0, param.length() - 2) 来删除最后两个字符。这将被提供给查询并检索结果。

关于java - 在循环内准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23606951/

相关文章:

java - Android Studio SDK 路径错误

mysql - MySQL中如何统计列值的出现次数?

java - 如何从 JSP 刷新/访问模型

java - 如何返回带有 ActionErrors 的多个表单的 JSP?

java - 将 post 数据从 JSP 发送到 Java Servlet

java - spring 数据 mongodb 存储库保存

Java 结果集 - 将 Java 日期与 SQL getDate() 进行比较

Java 泛型推断类型

mysql - 查询需要更多时间来执行

mysql - 将特定数据从一个 MySQL 表复制到另一个表