java - 使用元数据在 mysql 中插入查询

标签 java mysql jdbc sql-insert

我有一个由表的列名组成的列表

String tableName="employee";
ResultSet rs = Statement.executeQuery("SELECT * FROM"+tableName);
    ResultSetMetaData   rmd = rs.getMetaData();
        int columnCount = rmd.getColumnCount();
        List columnsList = new ArrayList();
        for (int i = 1; i <= columnCount; i++) {
            columnsList.add(rmd.getColumnName(i));
        }

列出值=[一些值];

now columnsList =[emp_id, name, salary, department];

现在我想使用这些列名编写插入查询。但我不想对列名进行硬编码,我想从列表中获取这些名称并将它们传递给列名,例如

   String subQuery= "insert into"+tableName+......here i want to get column names from list.....+.......here values from another list......;

有什么办法可以得到这个吗

最佳答案

一直在谷歌搜索我的#@$寻找代码shippet来动态生成元数据形式的JDBC插入语句。引用generateInsertStatements()

private static void generateInsertStatements(Connection conn, String tableName)
throws Exception {
    log("Generating Insert statements for: " + tableName);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); 
    ResultSetMetaData rsmd = rs.getMetaData();
    int numColumns = rsmd.getColumnCount();
    int[] columnTypes = new int[numColumns];
    String columnNames = "";
    for (int i = 0; i < numColumns; i++) {
        columnTypes[i] = rsmd.getColumnType(i + 1);
        if (i != 0) {
            columnNames += ",";
        }
        columnNames += rsmd.getColumnName(i + 1);
    }

    java.util.Date d = null; 
    PrintWriter p = new PrintWriter(new FileWriter(tableName + "_insert.sql"));
    p.println("set sqlt off");
    p.println("set sqlblanklines on");
    p.println("set define off");
    while (rs.next()) {
        String columnValues = "";
        for (int i = 0; i < numColumns; i++) {
            if (i != 0) {
                columnValues += ",";
            }

            switch (columnTypes[i]) {
                case Types.BIGINT:
                case Types.BIT:
                case Types.BOOLEAN:
                case Types.DECIMAL:
                case Types.DOUBLE:
                case Types.FLOAT:
                case Types.INTEGER:
                case Types.SMALLINT:
                case Types.TINYINT:
                    String v = rs.getString(i + 1);
                    columnValues += v;
                    break;

                case Types.DATE:
                    d = rs.getDate(i + 1); 
                case Types.TIME:
                    if (d == null) d = rs.getTime(i + 1);
                case Types.TIMESTAMP:
                    if (d == null) d = rs.getTimestamp(i + 1);

                    if (d == null) {
                        columnValues += "null";
                    }
                    else {
                        columnValues += "TO_DATE('"
                                  + dateFormat.format(d)
                                  + "', 'YYYY/MM/DD HH24:MI:SS')";
                    }
                    break;

                default:
                    v = rs.getString(i + 1);
                    if (v != null) {
                        columnValues += "'" + v.replaceAll("'", "''") + "'";
                    }
                    else {
                        columnValues += "null";
                    }
                    break;
            }
        }
        p.println(String.format("INSERT INTO %s (%s) values (%s)\n/", 
                                tableName,
                                columnNames,
                                columnValues));
    }
    p.close();
}

附加Metadata Example :

关于java - 使用元数据在 mysql 中插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123521/

相关文章:

java - 如果用户在注册时没有从图库中选择任何照片,我如何提醒用户?

java - 未选择时如何更改 MacOS 中 Java JComboBox 的背景颜色

java - 1&1 Mysql连接JAVA问题

java - 在 ant 任务中指定 jvm 参数

mysql - mysql中的负时差

php - 我如何使用 jquery 从表中删除特定行

java - 批处理 JDBC

mysql - 本地主机 mysql 访问被拒绝

java - 从结果集中提取时出错

java - HttpClient ssl 和 login.facebook.com