Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将哈希映射插入任何数据库表中_Java_Jdbc - Fatal编程技术网

Java 将哈希映射插入任何数据库表中

Java 将哈希映射插入任何数据库表中,java,jdbc,Java,Jdbc,我有一个具有以下定义的HashMap: myMap = new HashMap<String,String>(); 当然,列的数量取决于HashMap的大小。 如何通过迭代HashMap来实现这一点。 以下是我使用不同方法得出的结论,但我认为它不会正常工作: public void insertData(HashMap<String, String> dataMap, String tableName) { int size=dataMap.size();

我有一个具有以下定义的HashMap:

  myMap = new HashMap<String,String>();
当然,列的数量取决于HashMap的大小。 如何通过迭代HashMap来实现这一点。 以下是我使用不同方法得出的结论,但我认为它不会正常工作:

public void insertData(HashMap<String, String> dataMap, String tableName) {

    int size=dataMap.size();
    String sql = "INSERT INTO " + tableName;
    Iterator<Entry<String, String>> it = dataMap.entrySet().iterator();
    int counter = 1;
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        sql += pairs.getKey()+"="+pairs.getValue();
        if(size > counter )
            sql += ", ";
        counter++;
    }
    sql += ";";
}
public void insertData(HashMap dataMap,String tableName){
int size=dataMap.size();
字符串sql=“插入”+表名;
迭代器it=dataMap.entrySet().Iterator();
int计数器=1;
while(it.hasNext()){
Map.Entry pairs=(Map.Entry)it.next();
sql++=pairs.getKey()+“=”+pairs.getValue();
如果(大小>计数器)
sql+=“,”;
计数器++;
}
sql+=“;”;
}

您需要自己生成带有列名和占位符的准备语句SQL字符串。以下是一个启动示例:

StringBuilder sql = new StringBuilder("INSERT INTO ").append(tableName).append(" (");
StringBuilder placeholders = new StringBuilder();

for (Iterator<String> iter = dataMap.keySet().iterator(); iter.hasNext();) {
    sql.append(iter.next());
    placeholders.append("?");

    if (iter.hasNext()) {
        sql.append(",");
        placeholders.append(",");
    }
}

sql.append(") VALUES (").append(placeholders).append(")");
preparedStatement = connection.prepareStatement(sql.toString());
int i = 0;

for (String value : dataMap.values()) {
    preparedStatement.setObject(i++, value);
}

int affectedRows = prepatedStatement.executeUpdate();
// ...
StringBuilder sql=newstringbuilder(“插入”).append(tableName.append(“”);
StringBuilder占位符=新建StringBuilder();
for(迭代器iter=dataMap.keySet().Iterator();iter.hasNext();){
append(iter.next());
占位符。追加(“?”);
if(iter.hasNext()){
sql.append(“,”);
占位符。追加(“,”);
}
}
附加(“)值(”).append(占位符).append(“)”;
preparedStatement=connection.prepareStatement(sql.toString());
int i=0;
for(字符串值:dataMap.values()){
setObject(i++,值);
}
int affectedRows=prepatedStatement.executeUpdate();
// ...
这还有一个额外的优点,您可以使用
映射
,其中
对象
也可以是
数字
整数
,等等)、
日期
字节[]
,等等,至少是那些
准备语句
已经有setter方法的类型


请记住,如果
tableName
和map键由最终用户控制,您将面临严重的SQL注入攻击漏洞。

了解准备好的语句:我确实了解它们,但在这种情况下我不知道如何实现它们。因为要插入的列数对于不同的表是不同的。为此,我将考虑使用Jooq或SpringJDBC。它有点复杂。您必须生成一个查询,如
insert-into-tablename(col1,col2)值(?,)
。col1和col2是映射的键。然后您将遍历这些值(以相同的顺序),并对每个值的准备语句调用setString()。我想我的问题不是关于java,而是关于解决这个问题需要使用的算法
StringBuilder sql = new StringBuilder("INSERT INTO ").append(tableName).append(" (");
StringBuilder placeholders = new StringBuilder();

for (Iterator<String> iter = dataMap.keySet().iterator(); iter.hasNext();) {
    sql.append(iter.next());
    placeholders.append("?");

    if (iter.hasNext()) {
        sql.append(",");
        placeholders.append(",");
    }
}

sql.append(") VALUES (").append(placeholders).append(")");
preparedStatement = connection.prepareStatement(sql.toString());
int i = 0;

for (String value : dataMap.values()) {
    preparedStatement.setObject(i++, value);
}

int affectedRows = prepatedStatement.executeUpdate();
// ...