2016-09-29 242 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我的问题。 –