ResultSet 

- select의 조회결과를 자바에서 얻기 위해 cursor의 제어권을 저장한 객체

- 자바에서는 ResultSet을 써서 cursor가 위치한 행(record)의 컬럼값을 얻음 

-  !! 하는 일!!

1) cursor를 이동시키는 일

 * cursor : 조회 결과를 얻기 위해 움직이는 pointer

      > DB에서 테이블이 조회되면 inline view가 생성되는데, inline view 앞에 cursor가 존재

      >  cursor 이용하는 경우에는 previous() 쓰지 말자. 부하가 엄청 크다. 쿼리로 해결하자

  - 커서가 있는 위치에서 다음 레코드가 존재하는지? : rs.next()

     > 커서가 있는 위치에서 다음 레코드가 존재하면 true가 반환되고 커서의 위치가 아래로 이동함

     > 무조건 처음에 next()를 먼저 수행해야 커서가 컬럼의 값이 존재하는 레코드의 첫 행으로 내려갈 수 있음!

 

2) Oracle의 데이터형을 Java에 저장하기 위해 형변환을 수행

  - 오라클의 데이터형을 자바로 저장하기 위해 자바의 데이터형으로 변환하여 얻는 일

형식 Oracle Java ResultSet method
숫자 Number

정수 : byte, short, int, long getByte(), getShort(), getInt(), getLong()

실수 : float, double getFloat(), getDouble()
문자열 char / varchar2 String getString()
날짜 date Date getDate() 
// 반환형은 java.sql.Date (java.util.Date의 자식class)

   -  get method의 () 안에는 컬럼명 or 인덱스를 넣어서 값을 가져온다 

       > 인덱스는 1번부터 시작! cursor가 0번

      > 인덱스를 사용하면 가독성이 떨어지므로 되도록 컬럼명을 사용하여 코딩하자

   - Java API에서 ResultSet의 method 참고하여 골라 사용하자

 

 


# 오늘의 코딩 #

- Statement를 사용해보자!

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

import com.sun.net.httpserver.Authenticator.Result;

/**
 * Statement 사용한 DBMS 연동
 * @author user
 */
public class UseStatement {

	/**
	 * CP_DEPT 테이블의 모든 레코드 조회
	 * @throws SQLException
	 */
	public void selectAllCpDept() throws SQLException {
		
		//1. 드라이버 로딩
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}//end catch
		
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String id = "scott";
		String pass = "tiger";
		
		Connection con = null; // DB연동 유지, transaction, 쿼리문 생성객체 얻기
		Statement stmt = null; // 쿼리문 실행
		ResultSet rs = null ; // 조회(Cursor의 제어권), 데이터형 변환
				
		try {
		//2. Connection 얻기
			con = DriverManager.getConnection(url, id, pass);
		//3. 쿼리문 생성객체 얻기
			stmt=con.createStatement();
		//4. 쿼리문 수행 후 결과 얻기
			String selectCpDept = "select deptno,dname,loc from cp_dept";
			rs = stmt.executeQuery(selectCpDept); 
            // DB조회 결과로 인라인뷰가 만들어지고 커서 제어권 가져옴
			
			int deptno = 0;
			String dname = "";
			String loc = "";
			// 조회결과에서 커서의 첫 위치는 컬럼명이 있는 곳이므로 무조건 한번은 내려야 값이있는 행에 위치할 수 있음
			while(rs.next()) { // 포인터가 존재하는 위치 아래에 레코드가 존재하는지?
				//컬럼명으로 얻기 => 가독성이 높음
				deptno = rs.getInt("deptno");
				dname = rs.getString("dname");
		    	loc = rs.getString("loc");
		
				System.out.println(deptno + " / " + dname + " / " + loc);
			}//end while
			
		} finally {
		//5. 연결 끊기
			if(rs != null) {rs.close();}
			if(stmt != null) {stmt.close();}
			if(con != null) {con.close();}
		}//end finally
		
	}//selectAllCpDept
	
	public static void main(String[] args) {
		UseStatement us = new UseStatement();

		try {
			us.selectAllCpDept();
		} catch (SQLException e) {
			e.printStackTrace();
		}//end catch
		
	}// main

}// class

 

# 출력 결과 #

무사히 출력완료!

+ Recent posts