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

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.appendで変更できます。System.out.printSystem.out.println

于 2012-05-03T19:41:07.047 に答える
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 ...
}

(列の番号は 0 ではなく 1 から始まることに注意してください。)

データ自体については、ただ吐き出すだけなら、型を知る必要はありません。すべてに対して getString を実行するだけです。すべてのデータ型を文字列に変換できます。ブロブや画像がある場合は、それらをチェックすることをお勧めします。列の型を取得する ResultSetMetaData 関数があります。getType などだと思います。javadoc を確認してください。

そうは言っても、なぜこれをやりたいのですか?開発者がアドホック クエリを実行するために使用する何らかのツールを構築している場合は、問題ありません。しかし、このようなものをエンド ユーザーに公開することについては、非常に慎重です。(a) 彼らはデータを理解する可能性が低く、(b) 巨大なセキュリティ ホールが作成され、ユーザーはシステム内の任意のデータを見ることができます。これをチェックでラップして、ユーザーが表示を許可されているものに制限することもできますが、それを正しく行うには多くの作業が必要です. 「これはあなたが見ることが許されているものです」と言う方が、「これはあなたが見ることが許されていないものです」と言うよりもはるかに簡単です.

于 2012-05-03T19:28:30.853 に答える