java - 将 HashMap 插入任何数据库表

标签 java jdbc

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

  myMap = new HashMap<String,String>();

该映射由作为键的字段名称和作为当然值的字段值组成。我正在尝试创建一个将 HashMap 和表名作为参数的方法。我的查询必须具有以下格式,因为我不会插入表中的所有列:

INSERT INTO $tableName (?,?,?,?)
VALUES (?,?,?,?)

列数当然取决于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 += ";";
}

最佳答案

您需要自己生成包含列名和占位符的准备好的语句 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();
// ...

这还有一个额外的好处,您可以使用 Map<String, Object>哪里Object也可以是Number ( IntegerLong 等)、 Date , byte[] ,依此类推,至少是 PreparedStatement 的那些类型已经有 setter 方法。

请记住,如果 tableName 则存在严重的 SQL 注入(inject)攻击漏洞。和 map 键由最终用户控制。

关于java - 将 HashMap 插入任何数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150880/

相关文章:

sql - JDBC 使用 UPDATE FROM 状态

java - 带有 Sqlite 数据库的 JcomboBox

java - 无法返回对象类型?

java - 应该使用什么模式来解析 java 中的 RFC 3339 日期时间字符串

java - 从Java中的字符串中删除双引号

java - 来自 WorkBench 客户端的 MySQL 查询请求比 JDBC .executeQuery 花费的时间少得多

java - 无法在GAE应用程序中导入jar文件

java - 仅获取 `false` 作为返回值

java - 获取结果集已关闭错误 JDBC

java - 我如何知道使用 JDBC 为批量更新创建了哪些自动增量值?