如何使用Map生成String?

时间:2014-01-06 10:36:16

标签: java string map

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

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

这是我应该使用上面的Map制作的最终字符串。我将在下面的String中的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中的所有条目。有什么办法我可以通常使用地图生成上面的字符串吗?

4 个答案:

答案 0 :(得分:0)

从地图中,您可以获得给定密钥的值。 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 + " ";

答案 1 :(得分:0)

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

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注入

答案 2 :(得分:0)

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

的迭代器
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)) + " ";


}

答案 3 :(得分:0)

这是一个执行字符串插值的简单函数。它给出了一个模板字符串和一个参数图。模板字符串可能包含{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查询。根本不要!