0

我有下面的方法,它接受两个参数-

userId and attributes Map

属性 Map 将具有列名和列值-

举个例子,如果我在上面的地图中有 5 列,那么也会有 5 个键和 5 个值。

那么我的 SQL 将如下所示 -

String sql = "INSERT INTO PROFILE(userId, colA, colB, colC, colD, colE) VALUES ( ?, ?, ?, ?, ?, ?) ";

同样,我的查询语句看起来像 -

BoundStatement query = prBatchInsert.bind(userId, colAValue, colBValue, colCValue, colDValue, colEValue);

但在某些情况下,属性映射可能有 20 列。所以在此基础上,我需要制作sql和查询语句。

下面的代码几乎假设表格只有四列,这是不正确的。

public void upsertAttributes(final String userId, final Map<String, String> attributes) {

    try {
        String[] keys = (String[])attributes.keySet().toArray();

        String sql = "INSERT INTO PROFILE(userId, "+keys[0]+", "+keys[1]+", "+keys[2]+", "+keys[3]+") VALUES ( ?, ?, ?, ?, ?) "; 

        BoundStatement query = prBatchInsert.bind(userId, attributes.get(keys[0]), attributes.get(keys[1]), attributes.get(keys[2]), attributes.get(keys[3]));

    } catch (Exception e) {
        LOG.error(e);
    }

}

我怎样才能把上面的方法写得更通用attributes Map

4

1 回答 1

0

您应该使用 Spring jdbctemplate,它为此提供了大量的 api。查看此链接:http ://static.springsource.org/spring/docs/2.0.8/api/org/springframework/jdbc/core/JdbcTemplate.html

编辑:

检查此链接:http ://www.mkyong.com/spring/spring-named-parameters-examples-in-simplejdbctemplate/

它正是你想要的。

编辑:如果您不想使用 Spring,那么为了实现这一点,您需要动态生成完整的 sql 字符串。不会使用绑定。

看到这段代码[我没有运行这段代码,但这是实现这个的基本思想]:

public void upsertAttributes(final String userId, final Map<String, String> attributes) {

    try {
        String[] keys = (String[])attributes.keySet().toArray();

        String sql = "INSERT INTO PROFILE(userId, "+keys[0]+", "+keys[1]+", "+keys[2]+", "+keys[3]+") VALUES ( ?, ?, ?, ?, ?) "; 
        StringBuffer keysStmt = new StringBuffer("INSERT INTO PROFILE("+userId);
        StringBuffer valuesStmt = new StringBuffer("  VALUES (" );

        Iterator itr = attributes.keySet().iterator();

        while(itr.hasNext()){
            String key = itr.next();
            keysStmt.append(","+key);
            valuesStmt.append(attributes.get(key)+",");          
        }

       //remove last comma
       valuesStmt = new StringBuffer(valuesStmt.toString().substring(0,valuesStmt.length-1));

       sql = keysStmt.append(")")+valuesStmt.append(")");

    } catch (Exception e) {
        LOG.error(e);
    }

}
于 2013-04-21T05:47:40.117 回答