학원/JDBC

10/25 28-1 ResultSetMetaData (인터페이스)

도원결의 2022. 10. 25. 16:38

MetaData?? 

어떤 데이터에대한 데이터 ...

컬럼명 같은 거 어떤집합으로 묶여있는지에 대한 정보?

예를들어 

20 160 45
30 170 50
40 178 60
나이 몸무게
20 160 45
30 170 50
40 178 60

이렇게 숫자만 들어있는 표만 보면 이게 뭔지 알 수 없잖아??

근데 위에 행 하나만 추가하면 뭔지 알 수 있게 됨!! 저 맨 위에 추가한 행을 MetaData라고 함!

 

[특징]

ResultSetMetaData인터페이스를 통해 얻어 올 수 있다.
ResultSetMetaData인터페이스는 ResultSet 개체의 getMetaData()메서드로 얻어 올 수 있다.
-ResultSetMetaData는 컬럼명,컬럼의 null여부, 컬럼 타입 등 컬럼에 대한 정보를 가지고 있다.

 

[ResultSetMetaData의 주요 메서드]  => SELECT문 입력 시 주로 사용!

int getColumnCount():컬럼의 개수 얻어 온다.
String getColumnName(int column)  :컬럼의 이름을 얻어 온다. (column에는 인덱스 값을 준다)
int getColumnType(int column)   : 타입인데 숫자로 반환? 상수로 설정 되어 있음
String getColumnTypeName(int column)  : 컬럼의 타입을 얻어 온다.
int isNullable(int column)  : 컬럼의 null허용여부, ex) null허용 = 1, not null =0 

ex) 컬럼 개수 얻어오기

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM emp");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

 

[SELECT쿼리 실행시 컬럼에 대한 정보 얻기] 흐름 보기**

1.ResultSet객체의 getMetaData()로 ResultSetMetaData얻기

2.총 컬럼수 얻기-ResultSetMetaData의 int getColumnCount()

3.컬럼명 얻기-ResultSetMetaData의 String getColumnName(int column)

4.컬럼타입 얻기-int getColumnType(int column) :타입과 관련된 상수는 java.sql.Types클래스에 정의됨.

5.오라클의 타입명으로 반환  String getColumnTypeName(int column)

        6.컬럼의 NULL허용여부 :int isNullable(int column) : NULL허용 :1,NOT NULL:0

        7.컬럼의 크기 얻기 : getPrecision(int column)

 

[각 컬럼의 자리수 설정하기]
  오라클처럼  NUMBER타입(자리수 지정 안한 NUMBER포함)은 10자리
 DATE타입은 10자리(원래 오라클은 8자리) CHAR게열(VARCHAR2)는 해당 자리수로 설정하는데
 (단 NCHAR계열은 자리수의 2배로 설정)
 오라클 처럼 컬럼명 밑에  ---------  를 표시하기위한 작업

 

++하기 전 저번에 만들었던 IConnectlmpl 부모클래스에서 마지막 getQueryString() 메소드 구현 안했는데

이거 하기 전에 바꿔놓아야 함!

 

 

 

@Override
	public String getQueryString() {	
		System.out.print("SQL>");
		return sc.nextLine();
	}//////
public class ResultSetMetadataSQL extends IConnectImpl {
	//기본생성자로 연결
    public ResultSetMetadataSQL() {
			connect(ORACLE_URL,"scott","scott");
	}
    
    @Override
	public void execute() throws Exception {
    	   // 쿼리문 준비
    	  String sql = getQueryString();
           // preparedStatement 객체 생성
          psmt = conn.preparedStatement(sql);
           // 쿼리 실행! 끝에 ; 이거 입력하면 안됨!
          rs = psmt.executeQuery();
           //select 실행 시 컬럼 정보 얻기 metadata로 가져오기
          ResultSetMetaData rsmd = rs.getMetaData();
           // 컬럼 수 얻기
          int columnCount = rsmd.getColumnCount();
            System.out.println("총 컬럼 수:"+columnCount);
           // 컬럼명 얻기
          for(int i=1 ; i <= columnCount ; i++) {
				String columnName = rsmd.getColumnName(i);
				int length = columnName.length()+2;  //   2칸여백 줌
				System.out.print(String.format("%-"+length+"s", columnName));
		   }
           // 컬럼 타입 얻기 int getColumntype(int column)사용, types클래스에 정의됨.
                System.out.println("\r\n[자바의 컬럼타입으로 얻기]");
			   for(int i=1 ; i<= columnCount ; i++) {
                    int columnType = rsmd.getColumnType(i);
                    switch(columnType) {
                        case Types.VARCHAR: 
                            System.out.println("오라클의 VARCHAR2"); break;
                        case Types.NVARCHAR:
                            System.out.println("오라클의 NVARCHAR2");break;
                        case Types.CHAR:
                            System.out.println("오라클의 CHAR");break;
                        case Types.NCHAR:
                            System.out.println("오라클의 NCHAR");break;
                        case Types.NUMERIC:
                            System.out.println("오라클의 NUMBER");break;
                        case Types.TIMESTAMP:  // DATE 아님!!!!  이건 시분초까지 있음!
                            System.out.println("오라클의 DATE");break;	
                        default :
                            System.out.println("오라클 기타 자료형");										
				}				
			}  
           //컬럼타입 이름 getColumnTypeName 사용
	 	  System.out.println("[오라클의 컬럼타입으로 얻기]");
			for(int i=1 ; i<= columnCount ; i++) {
				String columnTypeName=rsmd.getColumnTypeName(i);
				System.out.println(columnTypeName);				
			}
		   //null 허용여부 isNullable 사용
		  System.out.println("[컬럼의 널 허용여부 얻기]");
			for(int i=1 ; i<= columnCount ; i++) {
				int isNull = rsmd.isNullable(i);
				System.out.println(isNull == 1 ? "NULL 허용" : "NOT NULL");
			}
		   //컬럼크기 얻기, 괄호 없는 건 0반환 getPrecision 사용
		  System.out.println("[컬럼의 크기 얻기]");
			for(int i=1 ; i<= columnCount ; i++) {
				int columnSize = rsmd.getPrecision(i);
				System.out.println(columnSize);      // 소수점이하 자리는 안나옴
			}	
            
           // 각 컬럼 자리 수 설정하기 오라클처럼 출력!!
			List<Integer> dashCount = new Vector<>();
			
			for(int i=1 ; i<= columnCount ; i++) {
				int columnType = rsmd.getColumnType(i);
				int columnSize = rsmd.getPrecision(i);
				switch(columnType) {				 
					case Types.NCHAR:
					case Types.NVARCHAR:
						dashCount.add(columnSize*2); break;	
					case Types.NUMERIC:
					case Types.TIMESTAMP: // DATE 아님!!!!  이건 시분초까지 있음!
						dashCount.add(10); break;
					default :
						dashCount.add(columnSize); break;								
			   }////swich
               //컬럼명 출력
               //컬럼명의 길이가 대쉬의 숫자(자료형크기)보다 크다면
               //ex) GENDER CHAR(1) 
               //   G
               //   -
               
				String columnName = rsmd.getColumnName(i).length() > dashCount.get(i-1) ? 
									rsmd.getColumnName(i).substring(0,dashCount.get(i-1)) :
									rsmd.getColumnName(i);				
				System.out.print(String.format("%-"+(dashCount.get(i-1)+1)+"s",columnName));				
			}///for
				System.out.println();  // 줄바꿈
				//dash출력
				for(Integer count : dashCount) {
					for(int i=0 ; i < count ; i++) System.out.print("-");
					System.out.print(" ");					
				 }///for
				System.out.println();// 줄바꿈
				// 데이터 출력
				while(rs.next()) {
					// 컬럼값 뽑기
					for(int i=1 ; i<= columnCount ; i++) {
						int columnType = rsmd.getColumnType(i);
						String columValue;
						if(columnType == Types.TIMESTAMP)  // 날짜만 타입 체크
							columValue = rs.getDate(i).toString();
						else
							columValue = rs.getString(i);
						System.out.print(String.format("%-"+(dashCount.get(i-1)+1)+"s",
													columValue==null? "" : columValue));
					}//for
					System.out.println();    // 줄바꿈
				}///while									
		}		
		finally {
		     close();
		}
          
    }
    

public static void main(String[] args) throws Exception {
		new ResultSetMetadataSQL().execute();
		
	}
}

 

이름 컬럼만 출력 해봄