2017-04-26 202 views
-2

我有一個Book表,它由"Title", "Genre", "Author" and "PageNumber"列組成,我也有一個searchBook(String title, String author, String Genre)方法來搜索書籍。我正在從用戶中檢索這些參數,因此其中一個或多個參數可能爲空,但我仍然想通過使用其餘參數進行搜索。我可以寫所有可能的情況下(例如if(title.equals("") && !author.equals("") && !genre.equals(""))但這似乎愚蠢對我來說是有一個簡短的方式來做到這一點Java mySQL multiple where Where子句

+0

您可以構建查詢以編程方式,省略值爲'null'或空的條款。 – Berger

+0

你能舉個簡單的例子嗎? –

回答

0

這是建立一個PreparedStatement查詢(因此?佔位符),只有可用的值的例子,那麼procedes更換值並執行查詢:

private void searchBook(final String title, final String author, final String Genre) { 

    Map<String, String> validParams = new HashMap<String, String>(); 

    if (!title.equals("")) { 

     validParams.put("title", title); 
    } 
    if (!author.equals("")) { 

     validParams.put("author", author); 
    } 
    if (!Genre.equals("")) { 

     validParams.put("genre", Genre); 
    } 

    if(validParams.isEmpty()){ 
     // if no value is correct, return 
     return; 

    } 

    StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("SELECT name from BOOK "); 
    boolean queryBuildStarted = false ; 

    for(String key : validParams.keySet()){ 

     if(!queryBuildStarted){ 
      queryBuilder.append(" WHERE "); 
      queryBuildStarted = true; 
     } 
     else{ 
      queryBuilder.append(" AND "); 

     } 


     queryBuilder.append(key+" = ?"); 
    } 


    PreparedStatement statement = connection.prepareStatement(queryBuilder.toString()); 

    int index = 1; 

    for(String key : validParams.keySet()){ 

     statement.setString(index, validParams.get(key)); 
     index ++; 
    } 


    ResultSet rs = statement.executeQuery(); 
    // do stuff 
} 
0

,你可以像這樣的查詢拆分的東西:?

String query= "SELECT * FROM table WHERE 1=1 "; 

if(!title.equals("")){ 

query += " AND title=?"; 

} 
if(!author.equals("")){ 

query += " AND author=?"; 

} 

等。 ..

0

如果你有完全的控制權,那麼你不應該使用空參數調用這個方法,而應該使用方法重載,也可以使用你自己的Builder或Criteria模式構造一個只有非空值的查詢。

您也可以構建是會選擇一切,當一個參數是空的查詢,例如:

SELECT * FROM Books WHERE title = IFNULL("something", title) AND author = IFNULL(null, author) AND genre = IFNULL(null, genre)

這意味着,在您的參數爲null,這會是與列的名稱所取代,從而選擇一切,如果它不是空(如我的例子中的標題),它只是要拿這個標題。我不建議這個解決方案,這是糟糕的性能。