Java 如何在地图数据上建立sql基础

Java 如何在地图数据上建立sql基础,java,sql,Java,Sql,我有下面的方法,它接受两个参数- userId和属性映射 属性映射将具有列名和列值- 让我们举一个例子,如果上面的映射中有5列,那么也将有5个键和5个值 那么我的SQL将如下所示- String sql=“插入到配置文件(userId、colA、colB、colC、colD、colE)值(?、、?、?、?)” 同样,我的查询语句如下所示- BoundStatement query=prBatchInsert.bind(userId、colAValue、colBValue、colcvvalue、c

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

userId和属性映射

属性映射将具有列名和列值-

让我们举一个例子,如果上面的映射中有5列,那么也将有5个键和5个值

那么我的SQL将如下所示-

String sql=“插入到配置文件(userId、colA、colB、colC、colD、colE)值(?、、?、?、?)”

同样,我的查询语句如下所示-

BoundStatement query=prBatchInsert.bind(userId、colAValue、colBValue、colcvvalue、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);
    }

}
public void upserttributes(最终字符串userId,最终映射属性){
试一试{
String[]keys=(String[])attributes.keySet().toArray();
String sql=“插入到配置文件(userId,“+keys[0]+”,“+keys[1]+”,“+keys[2]+”,“+keys[3]+”)值(?,,,,?)”;
BoundStatement query=prBatchInsert.bind(用户标识,attributes.get(键[0]),attributes.get(键[1]),attributes.get(键[2]),attributes.get(键[3]);
}捕获(例外e){
日志错误(e);
}
}

如何编写与
属性映射相对应的更通用的上述方法?

您应该使用Spring jdbctemplate,它为此提供了大量API。查看此链接:

编辑:

检查此链接:

这正是你想要的

编辑:如果您不想使用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);
    }

}
public void upserttributes(最终字符串userId,最终映射属性){
试一试{
String[]keys=(String[])attributes.keySet().toArray();
String sql=“插入到配置文件(userId,“+keys[0]+”,“+keys[1]+”,“+keys[2]+”,“+keys[3]+”)值(?,,,,?)”;
StringBuffer keysStmt=新的StringBuffer(“插入到配置文件(“+userId”);
StringBuffer valuesStmt=新的StringBuffer(“值(”);
迭代器itr=attributes.keySet().Iterator();
while(itr.hasNext()){
String key=itr.next();
keystmt.append(“,”+键);
valuesStmt.append(attributes.get(key)+“,”);
}
//删除最后一个逗号
valuesStmt=newstringbuffer(valuesStmt.toString().substring(0,valuesStmt.length-1));
sql=keysStmt.append(“”)+valuesStmt.append(“”);
}捕获(例外e){
日志错误(e);
}
}

我没有将spring模板用于此特定用例。而且我也不能使用它,所以我想这意味着我需要坚持一般的解决方案。但是谢谢你的链接。好的,有什么特别的原因吗?因为这就像是重新发明轮子。是的,我想避免额外的依赖性,因为我的项目中已经有很多依赖性,而且我相信没有这些也可以做同样的事情。