itsource

ResultSet의 데이터를 열 이름과 함께 인쇄합니다.

mycopycode 2022. 9. 4. 21:31
반응형

ResultSet의 데이터를 열 이름과 함께 인쇄합니다.

Java를 통해 SQL 데이터베이스에서 열 이름을 검색하는 중입니다. 수 걸 요.ResultSet. sql 을 사용합니다.

 select column_name from information_schema.columns where table_name='suppliers'

열 을 얻을 수 입니다.ResultSet 내 는 ★★★★★★★★★★★★★★★★★★★★★★.

public void getAllColumnNames() throws Exception{

String sql = "SELECT column_name from information_schema.columns where table_name='suppliers'";

PreparedStatement ps = connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery(sql);
 // extract values from rs


}
ResultSet resultSet = statement.executeQuery("SELECT * from foo");
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnsNumber = rsmd.getColumnCount();
while (resultSet.next()) {
    for (int i = 1; i <= columnsNumber; i++) {
        if (i > 1) System.out.print(",  ");
        String columnValue = resultSet.getString(i);
        System.out.print(columnValue + " " + rsmd.getColumnName(i));
    }
    System.out.println("");
}

레퍼런스: ResultSet 결과 인쇄

) 1) ★★★PreparedStatementStatement

2) 후 2) 실행 후ResultSet의 도움을 을 추출합니다.rs.getString()같이

Statement st=cn.createStatement();
ResultSet rs=st.executeQuery(sql);
while(rs.next())
{
    rs.getString(1); //or rs.getString("column name");
}

로서 한층 더 이용하다

rs.getString(1);
rs.getInt(2);

1, 2는 테이블의 열 번호이며 column의 데이터 유형에 따라 int 또는 문자열을 설정합니다.

더 나은 버전의 결과 세트 인쇄를 util 클래스로 원하는 분들을 위해 이것은 결과 세트를 인쇄하는 데 큰 도움이 되었고, 한 의 util로 많은 것을 할 수 있습니다.하미 토룬 덕분이야!

클래스에서는printResultSetResultSetMetaData일반적인 방법으로 그것을 살펴보세요.


import java.sql.*; java.import java.displaces.java.inport java.acaces 입니다.import java.aces.displays.import java.displays" 입니다.문자열 결합기;
DBTablePrinter { }
 * * 의 컬럼유형 카테고리:CHAR,VARCHAR
* 및 유사한 텍스트 열.
*/  CATGORY_STRING =CATGORY_STRING = 1 /** * * 의 컬럼유형 카테고리:TINYINT,SMALLINT * *INT ★★★★★★★★★★★★★★★★★」BIGINT컬럼을 클릭합니다.
*/  CATGERY_public static final int정정 = 2 ; /** * * 의 컬럼유형 카테고리:REAL,DOUBLE * * 。DECIMAL컬럼을 클릭합니다.
*/ =int 카테고리_DOUBLE  3; /** * 에 대한 열  는, * 사용해 주세요.DATE,TIME,TIMESTAMP*. */*/  CATGUARY_DATETHANGE =CATGORY_DATETIME = 4 /** * * 의 컬럼유형 카테고리:BOOLEAN컬럼을 클릭합니다.
*/  int CATGUARY_BOOLAN =CATGUARY_BOOLAN = 5;/** *  이름이 사용되는 의 열 내용 *이렇게 인쇄됩니다.BLOB * *BINARY,ARRAY*. */*/  Category_OTHER =카테고리 내기타 = 0;/** *  행 수.* " " " " " "네" "네" "네" "네" "네" "네" "네" "네" "네""
*/  DEFAULT_MAX_ROWS =int DEFAULT_MAX_ROWS = 10 /** *  열의  (* 경우:VARCHAR 을 표시합니다. 컬럼을 표시합니다.
*/  DEFAULT_MAX_TEXT_COL_WIDW =int DEFAULT_MAX_TEXT_COL_WIDW = 150;
 * 테이블에서 *tableName
* * * * * * * * * * * * * * * * * * * * * * *conn {@* {@link #DEFAULT_MAX_ROWS} * * 이(가) 제한에 됩니다.* {@link #DEFAULT_MAX_TEXT_COL_WIDW}   텍스트컬럼의 폭(예: a * 텍 a a ) VARCHAR열)을 클릭합니다.
 *  객체* @syslog conn "syslog.sql" 입니다. ) * @ tableName * @table @table * * */ *////////  */*/  printTable  conn, {public static void printTable(Connection conn, String tableName) { printTable(conn, tableName, DEFAULT_MAX_ROWS, DEFAULT_MAX_TEXT_COL_WIDW}
 * 테이블에서 *tableName
* * * * * * * * * * * * * * * * * * * * * * *conn. 행의 총수는 다음과 같이 제한됩니다.*maxRows그리고.* 제한에는 {@link #DEFAULT_MAX_TEXT_COL_WIDW}가 사용됩니다.* 텍스트 열의 폭(예:VARCHAR열)을 클릭합니다.
** @param conn 데이터베이스 연결 개체(java.sql).접속)* @param table 데이터베이스 테이블의 이름* @param maxRows 쿼리 및 인쇄할 최대 행 수*/public static void printTable(Connection conn, String tableName, int maxRows) {printTable(conn, tableName, maxRows, DEFAULT_MAX_TEXT_COL_WIDW);}
/*** 테이블에서 행을 인쇄하는 오버로드 메서드tableName
* 지정된 데이터베이스 연결을 사용하여 표준화*conn. 행의 총수는 다음과 같이 제한됩니다.*maxRows그리고.*maxStringColWidth제한에 사용되다* 텍스트 열의 폭(예:VARCHAR열)을 클릭합니다.
** @param conn 데이터베이스 연결 개체(java.sql).접속)* @param table 데이터베이스 테이블의 이름* @param maxRows 쿼리 및 인쇄할 최대 행 수* @param maxStringColWidth 텍스트 열의 최대 너비*/public static void printTable(Connection conn, String tableName, int maxRows, int maxStringColWidth) {if (syslog == null) {System.err.println("DBTablePrinter 오류:데이터베이스에 연결되어 있지 않습니다(연결은 null입니다).");반품}if (tableName == null) {System.err.println("DBTablePrinter 오류: 테이블 이름이 없습니다(tableName은 null입니다).");반품}if (tableName.length() == 0) {System.err.println("DBTablePrinter 오류: 빈 테이블 이름!");반품}if (max Rows)* 결과 {@link #DEFAULT_MAX_TEXT_COL_WIDW}을(를) 사용하여 표준으로 설정*: 텍스트 열의 너비를 제한합니다.
** @param rs TheResultSet인쇄하다*/public static void print ResultSet(ResultSet rs) {print Result Set(rs, DEFAULT_MAX_TEXT_COL_WIDW);}
/*** 의 행을 인쇄하는 오버로드된 메서드* 결과 표준으로 설정:maxStringColWidth
*: 텍스트 열의 너비를 제한합니다.
** @param rs TheResultSet인쇄하다* @param maxStringColWidth 텍스트 열의 최대 너비*/public static void print ResultSet(ResultSet rs, int maxStringColWidth) {{을(를) 시험해 보다if (rs == null) {System.err.println("DBTablePrinter 오류: 결과 집합이 null입니다!");반품}(rs.isClosed()) {System.err.println("DBTablePrinter 오류: 결과 집합이 닫혔습니다!");반품}if ( maxStringColWidth columns = new ArrayList(columnCount);

// 테이블 이름 목록.결합되어 있는 경우 여러 개일 수 있습니다.// 테이블 쿼리목록 테이블 이름 = 새 ArrayList(columnCount);

// 열과 해당 메타데이터를 가져옵니다.
// 메모: 열rsmd.getXX 메서드의 인덱스는 0이 아닌 1에서 시작됩니다.for (int i = 1, i maxStringColWidth) {값 = 값입니다.서브스트링(0, maxStringColWidth - 3) + "...";}부서지다}
// 열 너비 조정c.setWidth(value.length() > c.getWidth() ? value.length() : c.getWidth() ;
c.addValue(값);
} // loop column Count의 경우 종료rowCount++;
} // 시간 종료(rs.next)
/*이 시점에서 우리는 메타 데이터를 검토했습니다.모든 Column 오브젝트를 생성했습니다.이러한 오브젝트를 반복합니다.ResultSet 행 설정, 열 값 입력 및 조정열 너비
우리는 준비해야 하기 때문에 아직 인쇄를 시작할 수 없다.행 구분자 문자열.
*/
// 재미를 위해 String Builder를 사용합니다.StringBuilder strToPrint = 새 StringBuilder();StringBuilder rowSeparator = 새 StringBuilder();
/*행 구분 기호와 함께 인쇄할 열 레이블을 준비합니다.
다음과 같이 표시됩니다.
+------+-------------------------------------------------------------------------------------------------------| EMP_NO | BORTH_DATE | FIRST_NAME | LAST_NAME | (라벨 행)+------+-------------------------------------------------------------------------------------------------------*/
// 열에 걸쳐 반복(c열 : 열) {int width = c.getWidth();
// 열 레이블 가운데 맞춤인쇄할 문자열;문자열 이름 = c.getLabel();int diff = width - name.length();
if ((diff % 2) == 1)// diff는 2로 나눌 수 없습니다.폭에 1을 더합니다(및 diff).// 좌우에 균일한 패딩을 할 수 있도록// 열 레이블의 경우
폭++;diff++;c. setWidth(폭);
}
int padding Size = diff / 2; // InteliJ는 int로의 캐스팅은 용장하다고 말합니다.

// stackoverflow.com user102008 덕분에 Cool String 리피터 코드가 생성되었습니다.
문자열 패딩 = 새 문자열(new char[paddingSize]).replace("\0", ";
인쇄 방법 = "| " + 패딩 + 이름 + 패딩 + ";// END(종료) 열 레이블 중심 맞춤
strToPrint.append(toPrint);

rowSeparator.append("+");rowSeparator.append(새 문자열(새 문자[너비 + 2]).치환 \ 0 " , " ) ;}
문자열 lineSeparator = System.getProperty("line.separator");

// 이게 정말 필요한가요?
lineSeparator = lineSeparator == null? "\n" : lineSeparator;
rowSeparator.append("+").append(lineSeparator);

strToPrint.append("|").append(lineSeparator);
strToPrint.insert(0, rowSeparator);
strToPrint.append(rowSeparator);

StringJoiner sj = 새로운 StringJoiner() , ";(문자열 이름: table Names) {sj.add(이름);
}
문자열 정보 = "인쇄 중 " + rowCount;info += rowCount > 1 ? " " " " 행 " ;info += tableNames.size() > 1 ? "table " : "table ";info += sj.toString();
System.out.println(info);

// 형식화된 열 레이블 인쇄System.out.print(strToPrint.toString());

문자열 형식
// 행 인쇄(int i = 0; i)의 경우* 정수는 잘라내지 않아야 합니다. 따라서 열 너비는 잘라야 합니다.* 열 너비 제한 없이 조정됩니다.텍스트 열은 다음과 같아야 합니다.* 왼쪽 맞춤이며 최대 열 너비 등으로 잘릴 수 있습니다...

*

* ** java.sql. * 유형* @param type 반 sql sql SQL @ @ @ @ @* @return return * * *// /// */*/ which Category type) {카테고리(int ){ type {의 어느 쪽인가.{case Types( 유형 타입TINYINT: 타입 타입INTEGER:반환한다정수 타입타입10진수:한다.DOBUBLE_DOUBLE이 되다. ★★★★★★★★★★★★★★★★★DA타입타입TIME_WITH_TIMEZONE: 타입TIMESTamp:' 유형 types'TIMESTamp_WITH_TIMEZONE:TIMESTAMP_WITH_TIMEZONE합니다;카테고리_DATETIME을 반환한다. BOOLAN:반환한다;카테고리_부울리언을 반환한다. VARCHAR:사건 유형.케이스 타입NVARCHAR: NVARCHAR:사건 유형.케이스 타입LONGVARCHAR: 긴 바차:사건 유형.케이스 타입LONGNVARCHAR: 긴 메시지:사건 유형.케이스 타입CHAR: 문자:사건 유형.케이스 타입NCHAR:NCHAR: 돌아오CATEGORY_STRING. CATGORY_STRING을 반환한다. 기본: 디폴트:CATEGORY_OTHER 돌아오; 카테고리_기타 반환.} }} } * 을 나타냅니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」 */ 열 {private static " " { * * 열 * * 。 */ 레이블개인 문자열 라벨 * 에서* SQL* * * java.sql.* . * /*/ 유형private int 타 private * 에서* SQL ( * * java.sql.* . * /*/ 문자열 "typeName"; * 열 하는 값.* 및 * * * 。 */ width =private int width = 0; * 의 각 값*ResultSet*/ 정보 값 ="ArrayList()" = "ArrayList()"; * 를 사용 맞춤 String.format *(* 빈빈 。"")는, 「」,대시(*)입니다.-하여 왼쪽을 정렬합니다를 사용하여 왼쪽을 클릭합니다. * @ "# Left* @ "#justifyLeft()" */ 은 개인 문자열 """ = "",= " , * 열 카테고리* 열 * * * * * * * * * * * * * 。 *를 사용합니다* 올바른 인쇄를 위해 필요한 열 유형 및 특정 필요성에 대해 설명합니다. */ type Category =개인 int 유형 카테고리 = 0; * 새로운 * 을 구축합니다.Column" " " " " " " * 범용 ( 에서 정의)* "SQL" "SQL" ("SQL")* * * java.sql.* * 이름* @param label 유형* @param type 반 sql SQL @ @ @ @ 이름* @param typeName par sqlSQL */ column ( 타입, {public Column(「」,int」, 「String typeName」) {=this.label = 라;; =this.type = 유;; =this.typeName = typeName; } * 열합니다.* * * * * * * * * * * * * * * 。 * * 라벨* @return return럼* * * */*/ 문자열 Label {() {return label}을 가져옵니다.} * 합니다.* SQL 입니다. * * 유형* @return sql sqlSQL */ getType {public int getType() { 유형} * 합니다.* SQL 입니다. * * 이름* @return SQL sql*/ 문자열 {() { typeNametypeName type type type type type 。} * 합니다.* 열의 너비를 반환합니다. * * * @return 열 */ */ getWidth {public int getWidth() { 턴턴폭}} * 열를 * 의음음음음음음음음음음음음음음음 * / / / / / /로 설정합니다.width * * * @markets @markets **/*/ setWidthwidth) {public void setWidth(int width) {이것 폭; = }}} * * 를 추가합니다.String표현)value * 이입니다.* @link #values {@link #values} 입니다. * 이러한 값은 의 각 행에서 가져옵니다. * 세트쿼리의 * " " " " * " 입니다.(*) * 열 값* @link values {@link #values} paramparam #} * /*/ void Value ( 값) { add Value(「」)값); values.add(값)}; } * * 에 열 값을 반환합니다.i되므로 * 0으로 시작합니다.getValue(0) (*의) (*의* 결과 ** 결 * * 。 * * @i @parami* @return @return */ */*/ 문자열 i) {getValue( i) {i);반).get(i); } * * {@link #justify} 값을 반환합니다.플래그.은 *을(를) 사용하여 인쇄합니다.String.format는 글의을 나타낼 때 합니다.* 이 플래그는 텍스트의 오른쪽 또는 왼쪽 맞춤에 사용됩니다. * * @return {@link #justify}}이 열의 #justifyLeft* @ "#justifyLeft()" */ 문자열 {get Justify Flag() { justify Flag있습니다. ★★★★} * * {@link #justify} flag /agag ag / / / / / / / / / / / / / / / / / / / /"-"은 다음과 같이 인쇄하면 으로 남습니다.* 열 값은 다음과 같이 인쇄하면 올바른 값으로 유지됩니다.*String.format. 일반적으로 숫자는 정확합니다.* 정당화 되어 텍스트는 정당화 됩니다. */ Left ( 맞맞 = - , }} * 합니다.* SQL 입니다. * * @return 의@ {@link #typeCategory} */ getTypeCategory {public int getTypeCategory() { typeCategorytype Category를 반환한다.} * 합니다.* {@link #type Category}입니다. * * @param type 카테고리 // * /*/ void Type Category (Category 공용 void setTypeCategory(int typeCategory) { =this.typeCategory = typeCategory; }}}

이건 스칼라 버전이에요일반적인 방법으로 열 이름과 데이터도 인쇄합니다.

def printQuery(res: ResultSet): Unit = {
    val rsmd = res.getMetaData
    val columnCount = rsmd.getColumnCount
    var rowCnt = 0
    val s = StringBuilder.newBuilder
    while (res.next()) {

      s.clear()
      if (rowCnt == 0) {
        s.append("| ")
        for (i <- 1 to columnCount) {
          val name = rsmd.getColumnName(i)
          s.append(name)
          s.append("| ")
        }
        s.append("\n")
      }
      rowCnt += 1
      s.append("| ")
      for (i <- 1 to columnCount) {
        if (i > 1)
          s.append(" | ")
        s.append(res.getString(i))
      }
      s.append(" |")
      System.out.println(s)
    }
    System.out.println(s"TOTAL: $rowCnt rows")
  }

문서를 참조하십시오.당신은 다음과 같은 실수를 저질렀습니다.일단은ps.executeQuery()파라미터가 없습니다.대신 SQL 쿼리를 전달했습니다.

두 번째로, 준비된 성명서는?매개 변수를 전달하려면 기호를 누르십시오.그리고 나중에 다음을 사용하여 바인드합니다.

setXXX(index, value) 

여기서 xxx는 데이터 유형을 나타냅니다.

훌륭한 Java 데이터 과학/데이터 프레임 라이브러리인 TableSaw 라이브러리를 사용할 수 있습니다.코드는 간단합니다.

System.out.println(Table.read().db(resultSet).print());

당신이 하려는 일을 위해서,PreparedStatement사용할 수 있습니다.Statement코드는 다음과 같이 수정될 수 있습니다.

String sql = "SELECT column_name from information_schema.columns where table_name='suppliers';";

Statement s  = connection.createStatement();
ResultSet rs = s.executeQuery(sql);

이게 도움이 됐으면 좋겠다.

rowMapper incont를 사용한 솔루션.

저장소 클래스:

jdbcTemplate.query(sqlRequest, new ResponseQuikRowMapper())

행 매퍼 클래스:

public class ResponseQuikRowMapper implements RowMapper<Map<String, String>> {

@Override
@SneakyThrows
public Map<String, String> mapRow(ResultSet rs, int rowNum) {
    return IntStream.range(1, rs.getMetaData().getColumnCount())
            .mapToObj(columnNumber -> getColumnName(rs, columnNumber))
            .collect(Collectors.toMap(column -> column, value -> getColumnValue(rs, value)));
}

@SneakyThrows
private String getColumnName(ResultSet rs, Integer columnNumber) {
    return rs.getMetaData().getColumnName(columnNumber);
}

@SneakyThrows
private String getColumnValue(ResultSet rs, String column) {
    return Optional.ofNullable(rs.getString(column)).orElse("");
}

HashMap은 단순 매트릭스입니다.여기서 키는 열 이름이고 값은 값입니다. : )

언급URL : https://stackoverflow.com/questions/24229442/print-the-data-in-resultset-along-with-column-names

반응형