2014-02-06 21 views
0

我需要组建一个SQL字符串来搜索数据。给定一系列变量(A,B,C ...),如何形成Sql String Ex“A =?和B =?....”但只考虑非空变量?

我有一个很长的变量,如列表:String id, String fName, String city, int custType, ....和我的数据库表拥有所有这些列(ID,FName参数,LName的,市...)

我想基于该信息来搜索数据来自提供的变量,但只有非空变量应该用在SQL字符串中。

练习1如果变量是这样的:

String id="22"; 
    String fName=""; 
    String LName="Tom"; 
    String city=""; 
    int custType=0; 

然后

String sql="Select * from Customer "; 
String where=" where id=? and LName=?"; 
sql+=where; 
//then call DB 

练习2如果变量是这样的:

String id=""; 
String fName=""; 
String LName="Tom"; 
String city="Ny"; 
String postcode="211"; 

然后

String where=" where LName=? and city=? and postcode=?"; 

如果只有1个变量是不是空&其他都是空的,则没有必要AND,前String where=" where LName=?"

我想到把所有可变因素进入名单,但一些可变因素是int型的。我也不知道形成这样的字符串的最佳逻辑是什么。

你能想出任何好的解决方案吗?

回答

0

您可以检查字符串输入的StringUtils.isBlank()int不能容纳"",所以不需要检查""。取决于您可以连接字符串以形成最终的查询字符串。对于“And”和其他类似的逻辑,您可以选择拥有一个标志

+0

但我们必须遍历所有变量?如何 – Tum

+0

你有变量(可能作为参数),检查每一个。为什么需要循环 –

0

您必须在数据库中有一个唯一的键字段,因此用户必须输入该键。使用它你可以访问特定的用户。如果你还想检查一些其他领域意味着你可以使用“或”而不是“和”。

String where="where id="?" or fname=? or lname=?..."; 
0

这一个应该这样做。你应该使用int类型的int值而不是String。 的INT整数对象为好,这样你可以把它变成一个列表。构建Where过滤器(filterSql)的主要逻辑在方法appendColumnToWhere内。

之后,您可以使用PreparedStatementfilterSql并使用setObject(idx,...)来设置值。 JDBC驱动程序应处理您的值的类型。

public static void main(String[] args) { 
    //List of Variables 
    String col1 = "Test1"; 
    int col2 = 5;   //ints are Objects as well. 
    String col3 = ""; 
    String sql = "SELECT * FROM customer"; 

    //building where part 
    StringBuilder whereStatement = new StringBuilder(); 
    List values = new ArrayList(); 

    appendColumnToWhere(whereStatement, values, "col1", col1); 
    appendColumnToWhere(whereStatement, values, "col2", col2); 
    appendColumnToWhere(whereStatement, values, "col3", col3); 

    //building select 
    String filterSql = sql; 
    if (whereStatement.length() > 0) { 
     filterSql += " WHERE " + whereStatement.toString(); 
    } 

    //using select 
    System.out.println(filterSql); 
} 

private static void appendColumnToWhere(StringBuilder filter, List values, String colName, Object value) { 
    if (value == null 
      || (value instanceof String && ((String) value).isEmpty())) { 
     //skip empty values 
     return; 
    } 
    if (filter.length() > 0) { 
     filter.append(" AND "); 
    } 
    filter.append(colName).append("=?"); 
    values.add(value); 
} 
相关问题