Programming/JAVA

ORACLE에 저장된 DB테이블을 JDBC를 이용해 이클립스에서 결과집합 출력하기.(resultset 이용) 2022-02-07

최동훈1 2022. 2. 7. 17:14

우선적으로 JDBC의 기본적인 쿼리는 

연결/인증 - 문장실행 - 결과집합. 등으로 구성된다.

그 이유는 JDBC는 필요한 이유가 기본적으로 여러가지의 DB에 연결 호환성을 주기 위한 템플릿이기 떄문이다.

연결/인증 -문장실행 -결과집합은, 어느 DB에 연결하더라도 해당 DB를 사용하기 위해서 필수적으로 사용해야하는 과정이기에 JDBC는 각 DB에 맞춤형 함수들을 개발해서 JDBC 드라이버에 만들어놓았고, 우리는 그 JDBC DRIVER을 JDBC를 통해 이용하기만 하면 된다.

 

Class.forname("oracle.jdbc.driver.OracleDriver");
//각 DB에 맞는 Driver를 호출해 준다. *특이사항 클래스를 생성할때, new연산자 안씀.
Connection con= JdbcDriver.getConnection(url,user,password);
//호출한 Driver를 통해 연결/인증 과정을 거친다.
Statement st= con.createStatement();
//연결된 DB에 쿼리 실행이 가능한 "상태"를 만든다.
ResultSet rs=st.executeQuery(sql);
//문장실행하여 결과집합을 ResultSet에 담는다.

rs.close;
st.close;
con.close;

여기 연결/인증 과정을 거칠때, getConnection의 인자로 무엇이 와야될지 쉽게 감이 안 올 수 있는데, 연결할 DB의 사용자계정 정보를 넣으면 된다. 

Oracle DB에서 서버를 새로 만들때 입력한 정보(아래 형광색줄)을 url에 넣기.

직접 쿼리를 짜서 내가 NEWLEC PDB 서버 NOTICE 테이블에 등록한 데이터 한 셋을 불러와 보았다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class program {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
		String sql="select * from notice";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con=DriverManager.getConnection(url,"NEWLEC","vdongv1620");
		Statement st=con.createStatement();
		ResultSet rs=st.executeQuery(sql);
		if(!rs.next()) {
        //rs.next()메서드는 데이터가 없을시, false를 반환.
			System.out.println("조회된 데이터가 없습니다.");
		}
		String title= rs.getString("content");
		System.out.println(title);
			
		rs.close();
		st.close();
		con.close();
		
		
	}

}

 

 

실제 오라클 NOTICE 테이블에 저장된 데이터 들.

여기서 결과집합인 ResultSet에는 위에서 부터 순서대로 1줄씩 불려온다. 그래서 현재 상황은 1번 레코드가 불려왔고,

rs.getString("content"); 메서드에 의해, 해당 set의 content 컬럼이 출력되었다.

 

DB로 부터 불러온 1set의 contet 칼럼이 출력된 모습.

만약 1레코드씩 출력하는 것이 아닌, Notice 테이블의 모든 레코드를 출력할려면 어떻게 해야할까?

 

while(rs.next()) {
			int ID =rs.getInt("ID");
			String title=rs.getString(2);
			String writer=rs.getString(3);
			String content=rs.getString(4);
			Date Date=rs.getDate(5);
			int hit=rs.getInt(6);
			String Files= rs.getString(7);
			System.out.printf("ID: %d, Title: %s, Writer: %s, content: %s"
					+ "Date: %s ,hit: %d, Files: %s \n",ID,title,writer,content,Date,hit,Files);
			
			
		}
		System.out.println("EOF 파일의 끝에 도달했습니다.");

이렇게 하면 된다. 즉, rs.next를 반복문의 조건으로 넣고, 더이상 DB에서 불러올 set이 없을떄까지, 모든 칼럼을 출력하는 것이다. 또 rs.getString(int columnindex) 에 대해서 설명하자면 ,첫번째 칼럼의 인덱스를 1부터 시작하게끔, 정수값을 인자로 넣어주면 , 그 인덱스에 해당하는 칼럼이 지정된 타입으로 반환된다.

 

공부시간 2시간.

순공시간 1시간 40분.