0

下面的代码显示特定表的元组。我怎样才能把它变成动态代码?因此,用户将输入表格的名称,然后显示除表格内容之外的行和列名称。

* 请记住 res.getInt 和 res.getString 需要按原样指定。在动态模型中,我不需要知道列的数量、类型和名称。*

public void displayTableA()
{
    //Connection already established

    Statement st = conn.createStatement();
    ResultSet res = st.executeQuery("SELECT * FROM A");
    System.out.println("A_code: " + "\t" + "A_name: ");
    while (res.next()) {
        int r = res.getInt("A_code");
        String s = res.getString("A_name");
        System.out.println(r + "\t\t" + s);
    }
    conn.close();  
}
4

3 回答 3

0
public void displayTable(String table)
{
    //Connection already established

    Statement st = conn.createStatement();
    ResultSet res = st.executeQuery("SELECT * FROM " + table);
    ResultSetMetaData rsmd = res.getMetaData();
    while (res.next()) {
        for(int ii = 1; ii <= rsmd.getColumnCount(); ii++) {
            // get type
            int type = rsmt.getColumnType(ii);
            String value = null;
            switch (type) {
                case Types.VARCHAR: value = res.getString(ii); break;
            }
            // print value.
            System.out.print(rsmd.getColumnName(ii) + ": " + value);
        }
    }
    conn.close();  
}
于 2012-05-03T19:23:41.377 回答
0

直接回答:查询只是一个字符串。您可以根据用户输入构建它。就像将表的名称读入一个变量,说“字符串表名”,然后

String query="select * from " + tablename;

然后运行查询以获取结果集:

ResultSet rs=st.executeQuery(query);

然后获取结果集的元数据:

ResultSetMetaData meta=rs.getMetaData();

然后遍历获取它们的名称的列:

for (int x=1;x<=meta.getColumnCount();++x)
{
  String columnName=meta.getColumnName(x);
  ... do whatever you want with this column name ...
}

(请注意,列从 1 开始编号,而不是 0。)

至于数据本身,如果你只是把它转储出去,你不需要知道类型。只需对所有内容执行 getString 即可。每种数据类型都可以转换为字符串。好吧,如果您有斑点或图像,您可能需要检查它们。有一个 ResultSetMetaData 函数来获取列类型,我认为它是 getType 或类似的东西。检查javadocs。

也就是说,你为什么要这样做?如果您正在构建某种工具以供开发人员使用来执行临时查询,那很好。但我会非常谨慎地将此类内容暴露给最终用户。(a) 他们不太可能理解数据,并且 (b) 你会制造一个巨大的安全漏洞,用户可以看到系统中的任何数据。您可以将其包装在检查中以将用户限制为他们有权查看的内容,但要做到这一点需要做很多工作。说“这是你被允许看到的”比尝试说“这是你不被允许看到的”要容易得多。

于 2012-05-03T19:28:30.853 回答
0

如果要在转换inResultSet实例的动态查询中打印 a :ResultSetString

public static String toString(ResultSet rs) throws SQLException {
    StringBuilder sb = new StringBuilder();
    ResultSetMetaData metaData = rs.getMetaData();
    int columnCount = metaData.getColumnCount();
    Map<Integer, Integer> sizeMap = new HashMap<>();
    for (int column = 1; column <= columnCount; column++) {
        int size = Math.max(metaData.getColumnDisplaySize(column), metaData.getColumnName(column).length());
        sizeMap.put(column, size);
        sb.append(StringUtils.rightPad(metaData.getColumnName(column), size));
        sb.append(' ');
        sb.append(' ');
    }
    sb.append('\n');
    for (int column = 1; column <= columnCount; column++) {
        sb.append(StringUtils.rightPad("", sizeMap.get(column), '-'));
        sb.append(' ');
        sb.append(' ');
    }
    while(rs.next()) {
        sb.append('\n');
        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            String str = rs.getString(columnIndex);
            if (str == null) {
                str = "(null)";
            }
            sb.append(StringUtils.rightPad(str, sizeMap.get(columnIndex)));
            sb.append(' ');
            sb.append(' ');
        }
    }
    return sb.toString();
}

对于打印类似的东西:

user_id       user_code             date_update          
------------  --------------------  -------------------  
01006393      00989573              2011-09-29 19:23:46  
00984742      20192498              2011-12-21 00:00:00

此方法使用Commons Lang 3

注意:您应该小心使用它以避免内存错误。您可以更改sb.appendwithSystem.out.printSystem.out.println

于 2012-05-03T19:41:07.047 回答