优化if -else语句

时间:2016-09-29 11:07:16

标签: java if-statement jdbc

我正在编写一个查询来自db的记录。我将3个值传递给该方法。我想以这样的方式编写我的查询:该列的条件附加在传递的对应值为非null的查询中。我最后得到了凌乱的if 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 个答案:

答案 0 :(得分:2)

您可以这样写下您的附件:

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

并完成完整条款:

sql.append(" 1=1 ");

答案 1 :(得分:2)

您可以收集列表中的子句并使用“AND”加入,然后将args收集到另一个列表中,例如:

    // 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系列并取消注释Java 6系列。同时将Guava添加到您的项目中。

答案 2 :(得分: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()); 
}