检索用户指定表的内容

时间:2012-05-03 19:15:00

标签: java mysql sql

下面的代码显示了特定表的元组。如何将其转换为动态代码?因此,用户将输入表的名称,然后显示除表格内容之外的行和列名称。

*请记住,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();  
}

3 个答案:

答案 0 :(得分: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();  
}

答案 1 :(得分:0)

直接回答:查询只是一个字符串。您可以从用户输入构建它。就像把表的名称读成一个变量,比如“String tablename”,然后是

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)你将创建一个巨大的安全漏洞,用户可以看到系统中的任何数据。您可以将其包装在支票中以限制用户使用他们有权查看的内容,但要做到这一点还有很多工作要做。说“这是你可以看到的东西”然后试着说“这是你不允许看到的东西”要容易得多。

答案 2 :(得分:0)

如果您想在动态查询中打印ResultSet,请转换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.appendSystem.out.print

更改System.out.println