Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在循环中准备语句_Java_Sql_Jsp_Servlets_Jdbc - Fatal编程技术网

Java 在循环中准备语句

Java 在循环中准备语句,java,sql,jsp,servlets,jdbc,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

我正在尝试在循环中执行查询。
我正在尝试以下代码:

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;
    }

}
公共列表显示产品(字符串[]a)
{
结果集rs=null;
列表数据=null;
尝试
{

对于(int i=0;i我想您需要返回所有产品的列表,并勾选复选框。在这种情况下,我想您这里有一个逻辑错误。此方法仅返回最后一个产品记录。 您可以使用“IN”子句并一次性返回所有id,而不是循环使用不同的id。有许多不同的方法可以实现IN子句。下面给出的方法是一个简单的替代方法。您可以在或中检查各种操作

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

试一试

公共列表显示产品(字符串[]a){
结果集rs;
列出数据;
编制报表;
试一试{
StringBuilder参数=新建StringBuilder();
for(字符串str:a){
param.append(“”).append(str.append(“,”);
}
String query=“选择*来自品牌所在的产品(“+param.substring(0,param.length()-2)+”);
stmt=DataBaseConnection.DBConn.getConnection().prepareStatement(查询);
rs=stmt.executeQuery();
如果(rs!=null){
数据=新的ArrayList();
while(rs.next()){
产品p=新产品();
p、 setTitle(rs.getString(2));
p、 setCategory(rs.getString(3));
p、 设置子类别(rs.getString(4));
p、 setsubcategoritytwo(rs.getString(5));
p、 设定价格(rs.getInt(6));
p、 setflavor(rs.getString(7));
p、 setImage(rs.getString(8));
p、 setBrand(rs.getString(9));
p、 setInstock(rs.getString(10));
p、 设置库存数量(rs.getInt(11));
数据。添加(p);
}
}
}捕获(例外e){
e、 printStackTrace();
}最后{
stmt.close();
}
返回数据;
}
根据评论进行解释


好的。我想你的想法是传递一组品牌名称,如阿迪达斯、耐克等,然后选择所有产品详细信息。因此,你需要做一些类似于
select*的事情,从品牌所在的产品中('阿迪达斯'、'耐克')
。这将为您提供所有产品。因此,为此,您将所选品牌名称作为字符串数组传递。因此,我所做的是从数组中获取值,并对其进行格式化,并将其作为IN子句的参数。因此IN子句需要逗号分隔的值。因为这是一个Sting,我们还需要提供单引号
。因此,从数组中
[adidas,nike]
我需要构造
'adidas',nike'
。这就是在for循环中所做的,附加'and',逗号。因此在for循环之后,我们将在结尾处有一个额外的逗号和空格(例如'adidas',nike',)。为了删除这两个字符,我将substring作为
参数substring来删除最后两个字符(0,参数长度()-2)
。这将被输入查询并检索结果。

您的问题是什么?错误发生在哪里?请澄清问题。问题是,当执行select查询时,我返回了一个列表,但列表中没有任何内容。如果您建议正确关闭连接,为什么不将其添加到您的示例中?这不会发生使用try-with-resources进行更大的尝试。此外,将数据放入try中可以缩小范围并抓住OP犯下的错误。OP犯下的错误要容易得多(而且也遵循惯例)@Ordous:我只是想给出一个简单的示例,而不是一个完整的实现。无论如何,我已经更新了我的答案。谢谢你:)仔细想想,OP实际上从未关闭任何连接或语句/rs,这可能会破坏任何池机制。但你是对的,这与当前的逻辑问题无关。@Syam没有任何方法可以通过支票簿返回选定品牌的产品。为什么我不能执行Prepare语句mes。这段代码就是这样做的。输入数组应该具有所有选定的品牌名称,并返回与该品牌名称匹配的所有产品。您肯定可以多次执行prepared语句。但是每次执行实际上都是一个数据库调用,因此为了提高性能,最好保持较少的流量。
String arr[]=request.getParameterValues("On");     
List<Products> Data=new SessionBeanClass().DisplayProducts(arr);
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;
}