2016-09-29 592 views
1

我正在寫一個查詢從數據庫搜索記錄。我將3個值傳遞給該方法。我想以這樣的方式編寫我的查詢,使得該列的條件被附加到查詢中,該查詢的傳遞的相應值非空。如果有其他陳述,我已經結束了。有沒有辦法優化它?優化,如果-else語句

if (StringUtils.isNotEmpty(projectId)) { 
    sql.append(" UPPER(CIRC.PROJECT_ID) like ?"); 
} 

if (StringUtils.isNotEmpty(circuitId)) { 
    if (StringUtils.isNotEmpty(projectId)) { 
    sql.append(" AND"); 
    } 
    sql.append(" UPPER(CIRC.CIRCUIT_ID) like ?"); 
} 

if (StringUtils.isNotEmpty(orderRef)) { 
    if (StringUtils.isNotEmpty(projectId) || StringUtils.isNotEmpty(circuitId)) { 
    sql.append(" AND"); 
    } 
    sql.append(" UPPER(CIRC.ORDERID) like ?"); 
} 

JSONArray jsonArray = new JSONArray(); 
ResultSet rs = null; 
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 

PreparedStatement ps = null; 
try { 
    if (connection != null) { 
    ps = connection.prepareStatement(sql.toString()); 
    if (StringUtils.isNotEmpty(projectId)) { 
     ps.setString(1, "%" + projectId.toUpperCase() + "%"); 
    } 

    if (StringUtils.isNotEmpty(circuitId)) { 
     if (StringUtils.isEmpty(projectId)) { 
     ps.setString(1, "%" + circuitId.toUpperCase() + "%"); 
     } else { 
     ps.setString(2, "%" + circuitId.toUpperCase() + "%"); 
     } 
    } 

    if (StringUtils.isNotEmpty(orderRef)) { 
     if (StringUtils.isEmpty(projectId) && StringUtils.isEmpty(circuitId)) { 
     ps.setString(1, "%" + orderRef.toUpperCase() + "%"); 
     } else if (StringUtils.isEmpty(projectId) || StringUtils.isEmpty(circuitId)) { 
     ps.setString(2, "%" + orderRef.toUpperCase() + "%"); 
     } else { 
     ps.setString(3, "%" + orderRef.toUpperCase() + "%"); 
     } 
    } 

注意:這個問題不是orm/jdbc的主題。也請忽略硬編碼。

+3

「messy if else statements。有沒有辦法優化它。」第1步:格式化您的代碼。現在只是混亂而不完整。 –

+2

[codereview.stackexchange.com](http://codereview.stackexchange.com/) – Blobonat

+0

@AndyTurner我認爲完整的代碼是無關question.I已格式化的代碼。 –

回答

2

你可以收集條款列表中,並用 「AND」 連接,然後收集另一個列表中的參數,例如:

// Uncomment out on Java 6 
    // import com.google.common.base.Joiner; 

    List<String> clauses = new ArrayList<>(); 
    List<String> args = new ArrayList<>(); 

    if (StringUtils.isNotEmpty(projectId)) { 
     clauses.add("UPPER(CIRC.PROJECT_ID) like ?"); 
     args.add(projectId); 
    } 

    if (StringUtils.isNotEmpty(circuitId)) { 
     clauses.add("UPPER(CIRC.CIRCUIT_ID) like ?"); 
     args.add(circuitId); 
    } 

    if (StringUtils.isNotEmpty(orderRef)) { 
     clauses.add("UPPER(CIRC.ORDERID) like ?"); 
     args.add(orderRef); 
    } 

    // Java 8 (comment out for Java 6) 
    sql.append(clauses.stream().collect(Collectors.joining(" AND "))); 

    // Uncomment for Java 6 
    // sql.append(Joiner.on(" AND ").join(clauses)); 

    JSONArray jsonArray = new JSONArray(); 
    ResultSet rs = null; 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 

    PreparedStatement ps = null; 
    try { 
     if (connection != null) { 
      ps = connection.prepareStatement(sql.toString()); 
      for (int i = 0; i < args.size(); ++i) { 
       ps.setString(i+1, "%" + args.get(i).toUpperCase() + "%"); 
      } 
     } 
    } 

在Java 6上註釋掉Java 8行並unc省略Java 6行。還可以將Guava添加到您的項目中。

+0

你也可以upvote我的問題 –

+0

什麼類型的對象是從句? –

+0

這對我來說沒有任何作用我正在使用java 6但它是用於java 8 –

2

你可以寫你的追加像這樣:

sql.append(" UPPER(CIRC.PROJECT_ID) like ? AND "); 

,並與對應的全部章節的結束:

sql.append(" 1=1 "); 
+0

謝謝。您可以幫助優化** ps.setString(1,.. **這部分。 –

+0

您可以嘗試'getParameterMetaData'一行的東西,檢查當前在您準備的語句中的參數數量並使用它作爲你的索引 –

+0

如果你喜歡,你可以點擊我的問題 –

1
public static void main (String[]args){ 
    StringBuilder sql = new StringBuilder(); 
    sql.append ("Select * From Table where ");   
    String projectId = "11";   
    String circuitId = "";   
    String orderRef = "33"; 

    sql.append(StringUtils.isNotEmpty(projectId)?" UPPER(CIRC.PROJECT_ID) like ?":""); 
    sql.append(sql.toString().endsWith("?") && StringUtils.isNotEmpty(circuitId)?" AND":""); 
    sql.append(StringUtils.isNotEmpty(circuitId)?" UPPER(CIRC.CIRCUIT_ID) like ?":""); 
    sql.append(sql.toString().endsWith("?")&& StringUtils.isNotEmpty(orderRef)?" AND":""); 
    sql.append(StringUtils.isNotEmpty(orderRef)?" UPPER(CIRC.ORDERID) like ?":""); 
    System.out.println(sql.toString()); 
} 
+0

你也可以upvote我的問題。 –