我尝试在循环中执行查询。
我正在试用这段代码:
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);
请告诉我如何执行此操作并获得结果?
答案 0 :(得分:1)
我想你需要勾选所有产品的清单并勾选复选框。在这种情况下,我想你在这里有一个逻辑错误。此方法仅返回最后一条产品记录。 您可以使用&#39; IN&#39;而不是循环使用不同的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;
}
根据评论说明
确定。我想你的想法是传递一组品牌名称,如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)
删除最后两个字符。这将被提供给查询并检索结果。