10/25 28-1 ResultSetMetaData (인터페이스)
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();
}
}
이름 컬럼만 출력 해봄