【发布时间】:2014-05-20 17:34:56
【问题描述】:
您好,我正在尝试根据品牌、口味、价格、尺寸、类型过滤记录。我正在使用单个表单来处理这个问题,所以如果用户仅按品牌过滤,那么其他选项(如价格、风味)将被取消选中,所以我正在检查品牌、风味或价格是否为空。我得到了解决方案,但我做了很多所有情况的比较。我需要一个解决方案来减少比较。我正在使用以下代码
public List<Products> Filter_Items(String[] Brand, String[] Flavour,Float Price,String Size,String Type)
{
ResultSet rs;
List<Products> data = null;
PreparedStatement stmt;
try {
StringBuilder param = new StringBuilder();
if (Brand != null) {
for (String str : Brand) {
param.append("'").append(str).append("', ");
}
}
StringBuilder param1 = new StringBuilder();
if (Flavour != null) {
for (String str : Flavour) {
param1.append("'").append(str).append("', ");
}
}
String prm = param.toString().length() > 2 ? param.toString()
.substring(0, param.toString().length() - 2) : null;
String prm1 = param1.toString().length() > 2 ? param1.toString()
.substring(0, param1.toString().length() - 2) : null;
String query = "select * from products where ";
if (prm != null && prm1 != null) {
query += "Brand in (" + prm + ") and Flavour in (" + prm1 + ")";
} else if (prm != null && prm1 == null) {
query += "Brand in (" + prm + ")";
} else if (prm1 != null && prm == null) {
query += "Flavour in (" + prm1 + ")";
}
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("Ttile"));
p.setCategory(rs.getString("Category"));
p.setSubCategory(rs.getString("SubCategory"));
p.setSubCategoryTwo(rs.getString("SubCategorytwo"));
p.setPrice(rs.getInt("Price"));
p.setFlavour(rs.getString("Flavour"));
p.setSize(rs.getString("Size"));
p.setImage(rs.getString("image"));
p.setBrand(rs.getString("Brand"));
p.setInstock(rs.getString("instock"));
p.setInstockQty(rs.getInt("instockqty"));
data.add(p);
}
}
} catch (Exception e) {
System.out.println(e.getStackTrace());
return null;
}
return data;
}
}
【问题讨论】:
-
注意:
PreparedStatements 提供了一些防止 SQL 注入的保护,并且如果使用得当会获得一些性能提升。您没有正确使用它们(在 SQL 中嵌入未经处理的参数)。 -
好的,告诉我如何正确使用
-
仔细阅读我的评论。它解释了你做错了什么。顺便说一句...下次有人向您解释某些事情时,请尝试在发表“告诉我如何...”评论之前多考虑 1 分钟。
-
对不起,如果你介意的话。我没有这么说。我没有太多使用 SQL 的经验。
标签: java sql jsp servlets jdbc