Java 将哈希映射插入任何数据库表中
我有一个具有以下定义的HashMap: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();
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();
// ...