避免与条件语句进行比较

时间:2014-05-20 17:34:57

标签: java sql jsp servlets jdbc

您好我正在尝试根据品牌,口味,价格,尺寸,类型过滤记录。我正在使用单一形式处理这个,所以如果用户只按品牌过滤,那么其他选项,如价格,风味将被取消选中,所以我检查品牌或风味或价格是否为空。我得到了解决方案但我已经赚了很多比较所有病例。我需要一个解决方案,通过它我可以进行较少的比较。我正在使用以下代码

  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;

}


}

2 个答案:

答案 0 :(得分:0)

您可以像往常一样使用第三方库进行验证,例如javax验证或任何其他更专业的验证。
您可以使用所有getter和setter创建数据bean,并在bean上应用验证。

要传递数组,你需要像这样的getter和setter:

public class Foo {
    private int[] array;

    public Foo(int[] array) {
        this.array = Arrays.copyOf(array, array.length);
    }

    /** @param the array to use */
    public setArray(int[] array) {
        this.array = Arrays.copyOf(array, array.length);
    }

    /** @return a copy of the array */
    public int[] getArray() {
        return Arrays.copyOf(array, array.length);
    }
}

要验证bean,请参阅this教程。

答案 1 :(得分:0)

您真正需要的是根据逻辑上的命令开始命名变量。像prmprm1这样的名称毫无意义,而brandflavor作为变量名称更有意义,因为它们就是其中的内容。

我没有看到比较的数量是一个问题。但是给所有通用变量名称,然后甚至没有缩进if语句让我的眼睛茫然。

这样的事情怎么样:

if (brand != null && flavor != null)  
{
    query += "Brand in (" + brand + ") and Flavour in (" + flavor + ")";
} 
else if (brand != null && flavor == null) 
{
    query += "Brand in (" + brand + ")";
} 
else if (flavor != null && brand == null) 
{
    query += "Flavour in (" + flavor + ")";
}

编辑:您可以做的一件事是将SQL拆分为两个变量,一个用于主查询,一个用于where子句,然后只需添加到where子句:

private String addToWhereClause(String currentWhereClause, String fieldname, String value)
{
    String returnValue = "";
    if (value != null)
    {
        if(!"".equals(currentWhereClause))
        {
           returnValue += " AND ";
        }
        returnValue += " "+fieldname+" IN(" + value + ") ";
    }
    return returnValue;
}


String whereClause = "";
whereClause += addToWhereClause(whereClause, "Brand", brand);
whereClause += addToWhereClause(whereClause, "Flavour", flavor);
query = query + " " + whereClause;