【问题标题】:How to use a Map to generate a String?如何使用 Map 生成字符串?
【发布时间】:2026-01-11 06:50:03
【问题描述】:

下面是我的地图,它有两个键值对。我需要使用下面的地图来制作一个字符串。

Map<String, String> data = new LinkedHashMap<String, String>();
data.put("created_date", duration);
data.put("limit", limit);

这是我应该使用上面的地图制作的最后一个字符串。我将在下面的字符串的 where 子句中使用上面的 Map。我将在 where 子句中使用上述 Map 的键和值。

下面是我在 where 子句中使用上述 Map 后的最终字符串。

String sql = "select * from testing where created_date between " + dateMap.get(duration) + " and date(now()) ORDER BY attributes DESC limit " + Integer.parseInt(limit) + " ";

这是我尝试过的 -

private static void getValue(Map<String, String> newData) {

    for(Map.Entry<String, String> entry : newData.entrySet()) {

    String sql = "select * from testing where " +entry.getKey()+ " between " + dateMap.get(entry.getValue()) + " and date(now()) ORDER BY attributes DESC limit " + Integer.parseInt(limit) + " ";

    }   
}

但显然这是行不通的,因为它会一一迭代 Map 中的所有条目。有什么方法可以通用地使用地图生成上述字符串?

【问题讨论】:

标签: java string map


【解决方案1】:

如果您可以使用枚举映射并创建一组枚举键,则可以使代码更简洁。并使用单独的字段来保留日期字段名称,而不是使用键。那么你可能不需要这个迭代器

enum Keys {
    DATE_FIED,
    DATE_VALUE,
    LIMIT;
}
public static void main(String[] args) {

    Map<Keys, String> map = new EnumMap<>(Keys.class);
    map.put(Keys.DATE_FIED, "created_date");
    map.put(Keys.DATE_VALUE, "2004-12-05");
    map.put(Keys.LIMIT, "225");     
    String query = getValue(map);
}

private static String getValue(Map<Keys, String> map) {

    return "select * from testing where " 
                + map.get(Keys.DATE_FIED) 
                + " between " 
                + map.get(Keys.DATE_VALUE) 
                + " and date(now()) ORDER BY attributes DESC limit " 
                + Integer.parseInt(map.get(Keys.LIMIT)) + " ";


}

【讨论】:

    【解决方案2】:

    您可以从地图中获取给定键的值。 Map 返回一个对象。因此,您可以获得如下值和查询:

    String createdDate = (String)data.get("created_date");
    
    Integer limit = Integer.parseInt((String)data.get("limit"));
    
    String sql = "select * from testing where created_date between " + createdDate + " and date(now()) ORDER BY attributes DESC limit " + limit + " ";
    

    【讨论】:

    • 谢谢拉胡尔。但是在这种情况下,是否也有可能使用 Map 键?现在,您根本没有使用 Map 键,而只是从 Map 中获取 Map 键的值?我想同时使用地图的键和值来创建 SQL。
    • 如果不知道key,key的个数可能不同,需要循环查找map中的条目。之后,您可以使用键和值。
    【解决方案3】:

    请参阅无法实现,例如您对不同的密钥对值有不同的条件。但我认为没有必要这样做,您可以简单地使用

    String sql = "select * from testing where created_date between " + data.get("created_date") + " and date(now()) ORDER BY attributes DESC limit " + data.get("limit");
    

    注意:谨防 SQL 注入

    【讨论】:

      【解决方案4】:

      这是一个执行字符串插值的简单函数。它有一个模板字符串和一个参数映射。模板字符串可能包含{name} 形式的替换标记。这些将使用参数映射中的值填充。

      import java.util.HashMap;
      import java.util.Map;
      
      public class Main {
      
      
          public static String interpolate(String template, Map<String,?> parameters) {
      
              final StringBuilder buffer = new StringBuilder();
              final int end = template.length();
              int p = 0, last = 0;
      
              while (p < end) {
      
                  final char ch = template.charAt(p);
      
                  if (ch != '{') ++p;
                  else {
      
                      if (last < p) buffer.append(template, last, p);
                      final int start = ++p;
      
                      while (p < end && template.charAt(p) != '}') ++p;
      
                      final String name = template.substring(start, p);
                      final Object value = parameters.get(name);
                      final String text = value == null? "" : value.toString();
      
                      buffer.append(text);
                      last = ++p;
                  }
              }
      
              if (last < end) buffer.append(template, last, end);
              return buffer.toString(); 
          }
      
          public static void main(String[] args) {
      
              final Map<String,String> map = new HashMap<String, String>();
              map.put("start", "1");
              map.put("limit", "9");
              System.out.println(interpolate("select blorks from flupper where jummy > {start} order by fump asc limit {limit}", map));
          }
      }
      

      请勿使用此代码生成 SQL 查询。根本不要!

      【讨论】: