在循环内准备语句

时间:2014-05-12 10:46:14

标签: 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页面,我有Checkboxes,我在这个页面上显示多个产品。我正在按品牌对这些产品进行分类。用户通过选中复选框选择品牌。

我将checkbox的值传递给servlet和servlet调用函数Display Products:

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

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

1 个答案:

答案 0 :(得分:1)

我想你需要勾选所有产品的清单并勾选复选框。在这种情况下,我想你在这里有一个逻辑错误。此方法仅返回最后一条产品记录。 您可以使用&#39; IN&#39;而不是循环使用不同的ID。条款并立即返回。有许多不同的方法来实现IN子句。下面给出的是一个简单的替代方案。您可以在http://www.journaldev.com/2521/jdbc-preparedstatement-in-clause-alternative-approacheshttp://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;
}

根据评论说明

确定。我想你的想法是传递一组品牌名称,如adidas,nike等。并选择所有产品细节。所以你需要做select * from products where Brand in ('adidas', 'nike')之类的事情。这将为您提供所有产品。因此,您将选定的品牌名称作为字符串数组传递。所以我所做的是从数组中获取值并对其进行格式化,并将其作为IN子句的参数。因此IN子句需要逗号分隔值。由于它是Sting,我们也需要提供单引号'。所以从数组[adidas, nike]我需要构造'adidas', 'nike'。这就是在for循环中所做的,追加&#39;和,(逗号)。因此,在for循环之后,我们将在末尾添加额外的逗号和空格(例如,&#39; adidas&#39;,&#39; nike&#39;,)。为了删除它,我将子字符串作为param.substring(0, param.length() - 2)删除最后两个字符。这将被提供给查询并检索结果。