2016-07-27 12 views
1

私はMySQLのコマンドラインインターフェイスでデータベースを照会するとき、私はいくつかの素晴らしい清書表形式の出力を得る:JDBC形式ResultSetを表形式の文字列として使用しますか?

mysql> select * from users; 
+------------+--------------------------------------+------------+ 
| IGN  | UUID         | AdminLevel | 
+------------+--------------------------------------+------------+ 
| GamerBoy | 0fcba4a5-f039-4771-ae22-bf203ed89c1c |   3 | 
+------------+--------------------------------------+------------+ 

、Javaで私は、クエリの結果を格納するためにResultSetを使用する必要があり、ここにあります現在持っているコード:

String query = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); 
System.out.println("Querying the database with: " + query); 
try { 
    Statement stmt = dbConnection.createStatement(); 
    ResultSet rs = stmt.executeQuery(query); 
    System.out.println("Query parsed successfully!"); 
    /* What need to go here? I want to output the result of the query 
    * in the same way that the MySQL tool would - some prettified String. 
    */ 
} catch (SQLException exception) { 
    System.out.println("Query failed: " + exception.getMessage()) ; 
} 

MySQLが私に与える出力の種類を含む文字列を取得するにはどうすればよいですか?その後、そのきちんとした表形式でクエリの結果を出力する -


基本的に、私はデータベースを照会することができますJavaプログラムを作りたい - クエリが毎回異なることができ、ユーザーが選択されていますMySQLが使用します。

どうすればいいですか?

+2

ResultSetは、MySQLで使用される書式設定を保持しません。 MySQLのように見せたいのであれば、自分でその書式を作成する必要があります。 –

+0

@SusannahPotts私はJDBCで始まったばかりです。問題はそれほど簡単ではありません。私は、テーブルの名前や列数などは問わず、ユーザーがどのテーブルを照会しているのか知りません。 – theonlygusti

+2

私はそれが自明ではないと思っていました。私は、ResultSetがあなたが作成しなければならない書式設定や書式設定を保持していないと単純に述べていました。 –

答えて

3

ResultSetオブジェクトrsを自分で処理する必要があります。

while(rs.next()){ 
    String ign = rs.getString("IGN"); 
    // ... get uuid and admin level 
    System.out.println(ign + uuid ...); 
} 

使用ResultSet#getMetaData()あなたが列名を知らない場合:

ResultSetMetaData rsmd = rs.getMetaData(); 
int columnCount = rsmd.getColumnCount() ; // returns the number of columns 
for(int i = 1; i < columnCount + 1; i++){ 
    rsmd.getColumnName(i); 
} 

が列を1インデックス付けされていることに注意してくださいを、つまり、最初の列名は次のようになります。rsmd.getColumnName(1);

Java8 ResultSetMetaData API

+0

しかし、私は潜在的なフィールド(列名?)を知らない - Idon'tは、ユーザーが照会したテーブルを知っていません。 – theonlygusti

+0

@theonlygusti私の更新を参照してください – haifzhan

+0

私を始めてくれてありがとう、私は結局['ResultSetMetaData#getColumnTypeName'](https://docs.oracle.com/javase/7/docs/api/java/)を使う必要がありました。私は 'getString'、' getInt'などを使用する必要があるかどうかを確認するメソッドです。 – theonlygusti

2

使用ResultSet.getMetaData()はそれに応じて、各列と列のいないと設計テーブルを知るためにチェック。

汚れていないサンプルです。

private String processResultSet(ResultSet rs) throws Exception 
    { 
     StringBuilder sb = new StringBuilder(); 

     ResultSetMetaData rsmd = rs.getMetaData(); 
     int totalCols = rsmd.getColumnCount(); 
     int[] colCounts = new int[totalCols]; 
     String[] colLabels = new String[totalCols]; 
     for(int i = 0; i < totalCols; i++) 
     { 
      colCounts[i] = rsmd.getColumnDisplaySize(i+1); 
      colLabels[i] = rsmd.getColumnLabel(i+1); 
      if(colLabels[i].length() > colCounts[i]) 
      { 
       colLabels[i] = colLabels[i].substring(0, colCounts[i]); 
      } 
      sb.append(String.format("| %"+ colCounts[i] +"s ", colLabels[i])); 
     } 
     sb.append("|\n"); 

     String horizontalLine = getHorizontalLine(colCounts); 
     while(rs.next()) 
     { 
      sb.append(horizontalLine); 
      for(int i = 0; i < totalCols; i++) 
      { 
       sb.append(String.format("| %"+ colCounts[i] +"s ",rs.getString(i+1))); 
      } 
      sb.append("|\n"); 

     } 


     return (getHorizontalLine(colCounts)+sb.toString()); 
    } 

    private String getHorizontalLine(int[] colCounts) 
    { 
     StringBuilder sb = new StringBuilder(); 

     for(int i = 0; i < colCounts.length; i++) 
     { 
      sb.append("+"); 
      for(int j = 0; j < colCounts[i] + 2; j++) 
      { 
       sb.append("-"); 
      } 
     } 
     sb.append("+\n"); 

     return sb.toString(); 
    } 
+0

これは非常に便利です...私がどのようにループできるかの素早く汚れた例を投稿してもいいですか?各ResultSetエントリを介して、次に各列を介して – theonlygusti

+0

@theonlygustiがちょうどそれを追加しました。 –

+0

ちょうど私のサーバーがクラッシュする原因となった....長すぎるチック、無限ループを推測する。 – theonlygusti

関連する問題