2014-02-06 20 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); 
} 
相關問題