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