2016-07-27 3 views
1

내가 멋진 prettified 표 출력을 얻을 MySQL의 명령 줄 인터페이스에서 데이터베이스 쿼리 : 여기에 자바에서 나는 쿼리의 결과를 저장하는 ResultSet을 사용해야합니다,JDBC 형식 ResultSet을 테이블 형식 문자열로 사용 하시겠습니까?

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

지금, 그리고 현재 가지고있는 코드 :

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에서 제공하는 출력이 포함 된 문자열을 어떻게 얻을 수 있습니까?


는 기본적으로, 데이터베이스 쿼리 할 수있는 자바 프로그램을 만들고 싶어 - 쿼리마다 다를 수 있습니다, 그것은 사용자 선택 -하고 깔끔한 표 형식으로 쿼리의 결과를 출력하는 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/)을 사용해야하는 번거 로움이 있습니다. sql/ResultSetMetaData.html # getColumnTypeName (int)) 메소드를 사용하여 '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