java
  • sql
  • user-interface
  • 2015-12-02 62 views 1 likes 
    1

    我正在使用java创建一个GUI以让用户从汽车表中搜索。有7个领域可供搜索:VIN,品牌,型号,年份,里程,价格和颜色。用户可以从一个字段到所有字段中选择任意组合来搜索汽车。忽略使用Java和SQL的GUI中的空白搜索

    根据其组合的用户离开空白我使用:

    select * from Cars where color = '"+color+"'" 
    

    select * from Cars where mileage = '"+mileage1+"' and color = '"+color+"' 
    

    但考虑到7场有128种组合。我是否必须实施所有可能的组合?或者当用户离开一个或多个字段为空时,SQL可以忽略这种方式吗?

    回答

    0

    只是contruct你的SQL语句,如果字段填你添加到SQL字符串

    sql = "select * from Cars where" 
        if(field1.text.toString().trim().compareTo("") == 0) sql = sql + field1; 
    


    不要忘记 “和”
    *编辑:从不信任用户输入(SQL注入)*

    2
    public class Filter { 
        private final Set<String> fields; 
        private final Map<String, String> search; 
    
        public Filter(String ... fields) { 
         this.fields = new HashSet<>(Arrays.asList(fields)); 
        } 
    
        public void addSearch(String field, String value) { 
         if (field != null && value != null && fields.contains(field)) { 
          search.put(field, value); 
         } 
        } 
    
        public String toSQL() { 
         StringBuilder builder = new StringBuilder(); 
         for (Map.Entry<String, String> entry : search) { 
          String field = entry.getKey(), value = entry.getValue(); 
          if (builder.length() == 0) { 
           builder.append("WHERE "); 
          } else { 
           builder.append("AND "); 
          } 
          builder.append(field).append(" = '").append(value).append("'") 
         } 
         return builder.toString(); 
        } 
    } 
    

    这是一个非常简单的解决方案,您肯定可以改进。 使用方法如下:

    Filter filter = new Filter("color", "mileage" /* and other columns */); 
    filter.addSearch("color", color); 
    
    String sql = "SELECT * FROM Cars " + filter.toSQL(); 
    

    你或许应该检查用户输入,以防止SQL注入和其他可能的滥用。

    另一个更专业的解决方案是“对象关系映射”,在Java中使用JPA。 Google“JPA”,“Criteria API”,“Hibernate”或“ORM”。

    相关问题