gpt4 book ai didi

java - 在循环内准备语句

转载 作者:行者123 更新时间:2023-12-01 12:59:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com