ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC (Java DataBase Connectivity) - 조회 Part 2
    프로그래밍 언어/JDBC 2020. 11. 13. 17:40
    728x90
    반응형

    1 - 3) EmpDAOempDAO.selectAll() 메소드 설정

    EmpDAO.java에 있는 selectAll()메소드를 설정 하자

    public List<Emp> selectAll() {
    		
    		// JDBC 객체 선언(java.sql 패키지에 존재하는 객체)
    		Connection conn = null; 
    		// DB와의 연결 정보를 담은 객체 
    		// -> 프로그램과 DB 사이를 연결해주는 일종의 길
    		
    		Statement stmt = null;
    		// Connection 객체를 통해 DB에 SQL문을 전달하고 실행하여 
    		// 결과를 반환받는 역할을 하는 객체
    		
    		ResultSet rset = null;
    		// DB에서 SELECT 절의 성공 시 반환되는 객체 
    		// - SELECT문의 결과로 생성된 테이블을 담고 있으며
    		// '커서(CURSOR)'를 이용해 한 행씩을 참조할 수 있다.
    		
    		List<Emp> empList = null;
    		// DB에서 조회한 결과를 저장할 List
    				
    		try {
    			
    			// 1_5. JDBC 드라이버 클래스 메모리 로드
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			// 프로그램과 DB 사이의 연결 역할을 해주는 JDBC 드라이버 로드
    			// 오라클 DB와 연결하기 위한 JDBC 드라이버 : "oracle.jdbc.driver.OracleDriver"
    			// 해당 드라이버를 호출함으로써 메모리에 로드된다.
    			
    			// 1_6. DB와의 연걸 작업 준비
    			/*
    				연결 정보를 담을  Connection을 얻어옴.
    				-> Connection을 얻어오기 위해서는 DriverManager가 필요
    			*/
    			
    			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
    			/*
    				jdbc:oracle:thin -> JDBC 드라이버의 타입이 thin 타입임을 의미함	
    				@127.0.0.1 -> 자신의 컴퓨터 로컬 ip (== @localhost	 대체가능)
    				
    				:1521 -> 오라클 listener의 포트번호 
    						(포트: 응용 프로그램이 외부와 통신하기 위한 통로)
    				
    				:xe -> 오라클 DB 이름
    				
    				"scott" : 접속할 사용자 이름(계정
    				"tiger" : 해당 계정의 비밀번호
    				
    			*/
    			// DB와의 연결과 관련된 요쇼들은 모두 SQLException을 발생시킬 가능성이 있다. 
    			
    			// DB 접속 성공 시 conn을 출력하면 연결객체의 구조가 출력됨.
    			// 실패 시 null 출력
    			// System.out.println(conn);
    			// oracle.jdbc.driver.T4CConnection@6438a396
    		
    			// 1_7. DB 접속 성공 시 DB에다가 전달할 SQL구문을 준비하고 
    			// 이를 전달하여 결과를 얻어올 객체 Statement 객체를 생성
    			String query = "SELECT * FROM EMP";
    			// **** 주의사항 ****
    			// JAVA단에서 SQL 구문 작성 시 세미콜론을 붙이면 안된다!!!
    			
    			stmt = conn.createStatement();
    			
    			rset = stmt. executeQuery(query);
    			// *** Statement.executeQuery(query)
    			// -> DB로 SELECT문을 전달하고 결과로 ResultSet을 반환받음.
    
    			// 1_8. ResultSet rset에 있는 SELECT 처리 결과를
    			// JAVA단에서 쉽게 사용할 수 있도록
    			// List객체에 저장 시키기
    			
    			// DB와의 통신 성공 시 List 객체를 생성.
    			// -> 오류가 났을 경우에 메모리 손실을 방지하기 위해
    			empList = new ArrayList<Emp>();
    			
    			while(rset.next()) {
    				// ResultSet.next() : 반환받은 조회 결과를 
    				// 커서를 이용해 순차적으로 한 행씩 접근
    				// 접근한 행이 존재하면 true, 없으면 false
    				
    				// ResultSet에서 현재 접근한 행의 데이터를 꺼내는 방법
    				// get[타입]("컬럼명")
    				int empNo = rset.getInt("EMPNO"); // 7369
    				String eName = rset.getString("ENAME"); // SMITH
    				String job = rset.getString("JOB");
    				int mgr = rset.getInt("MGR");
    				Date hireDate = rset.getDate("HIREDATE");
    				int sal = rset.getInt("SAL");
    				int comm = rset.getInt("COMM");
    				int deptNo = rset.getInt("DEPTNO");
    				
    				// 얻어온 행의 정보를 통해 Emp 객체를 만들어 
    				// empList에 추가하기
    				
    				empList.add(new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo));
    
    			}
    			
    		}catch(ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			// 1_9. JDBC 관련 객체 연결 끊기(자원 반환)
    			// 연결을 끊을 경우 역순으로 끊어 나가기
    			try {
    				if (rset!=null) {	
    					rset.close();
    				}
    				if (stmt!=null) {	
    					stmt.close();
    				}
    				if (conn!=null) {	
    					conn.close();
    				}
    				
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		return empList;
    	}

     

    프로그램과 DB 사이의 연결 역할을 해주는 JDBC 드라이버 로드인 

    Class.forName("oracle.jdbc.driver.OracleDriver");

    코드를 살펴보자.

    JDBC 드라이버 클래스는 oracle에 있는 정보를 연결하기위해 다음줄에 있는

    conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");

    이 코드의 연결 정보를 가져와 연결할 수 있게 해준다.

     

    coDriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");속의 괄호들을 살펴보면

     

    jdbc:oracle:thin : JDBC 드라이버의 타입이 thin 타입임을 의미
    @127.0.0.1 -> 자신의 컴퓨터 로컬 ip (== @localhost  대체가능)
    :1521 -> 오라클 listener의 포트번호  (포트: 응용 프로그램이 외부와 통신하기 위한 통로)
    :xe -> 오라클 DB 이름
    "scott" : 접속할 사용자 이름(계정)
    "tiger" : 해당 계정의 비밀번호

    를 의미한다.

     

     

     

     

    하지만 DB와의 연결과 관련된 요쇼들은 모두 SQLException을 발생시킬 가능성이 있기때문에

    try - catch 문을 사용해서 catch에서 예외처리 ClassNotFoundExceptionSQLException를 처리해준다.

    catch(ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

     

    DB 접속 성공 시 DB에다가 전달할 SQL구문을 준비하고 

    오라클의 조회 구문인 SELECT 문을 사용해 JAVA로 불러 오도록 해보자

    String query = "SELECT * FROM EMP";

    EMP의 모든 사원을 조회하는 SQL구문이다.

    이를 전달하여 결과를 얻어올 객체 Statement 객체를 생성한다.

    stmt = conn.createStatement();
    rset = stmt.executeQuery(query);

     

    연결에 성공한 conn을 생성createStatement()stmt에 대입하고 

    대입한 stmtrsetexecuteQuery(query)를 써서 DB로 SELECT문을 전달하고 결과로 ResultSet을 반환받는다.

     

    while(rset.next()) {
    	// ResultSet.next() : 반환받은 조회 결과를 
    	// 커서를 이용해 순차적으로 한 행씩 접근
        // 접근한 행이 존재하면 true, 없으면 false
    
        // ResultSet에서 현재 접근한 행의 데이터를 꺼내는 방법
        // get[타입]("컬럼명")
        int empNo = rset.getInt("EMPNO"); // 7369
        String eName = rset.getString("ENAME"); // SMITH
        String job = rset.getString("JOB");
        int mgr = rset.getInt("MGR");
        Date hireDate = rset.getDate("HIREDATE");
        int sal = rset.getInt("SAL");
        int comm = rset.getInt("COMM");
        int deptNo = rset.getInt("DEPTNO");
    
        // 얻어온 행의 정보를 통해 Emp 객체를 만들어 
        // empList에 추가하기
    
        empList.add(new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo));
    
    				
    }

    while문을 통해 전달 받은 조회 결과를 empListadd함수를 이용해 하나씩 추가해준다.

    추가를 하기위해선 getInt 또는 getString 을 이용해 데이터를 꺼낸 뒤

    오라클에 있는 타입과 컬럼명을 맞춰서 설정 한 후 empList.add()함수에 추가한다.

     

    모든 데이터를 추가 한 후

    return empList;

    empList return해준다.

     

    전달 하기 전에 finally를 통해 JDBC 관련 객체들의 연결을 끊어줘야 한다.

    끊어줄 때는 역순으로 끊어주어야한다.

    finally {
        // 1_9. JDBC 관련 객체 연결 끊기(자원 반환)
        // 연결을 끊을 경우 역순으로 끊어 나가기
        try {
          if (rset!=null) {	
          rset.close();
          }
          if (stmt!=null) {	
          stmt.close();
          }
          if (conn!=null) {	
          conn.close();
          }
        } catch (SQLException e) {
        e.printStackTrace();
        }
    }

     

     

    전달을 한 뒤 EmpRun.java파일에 있는 main함수 실행하면

    public class EmpRun {
    	public static void main(String[] args) {
    		new EmpView().displayMain();
    	}
    }

    안에 있는 displayMain() 를 호출해서 출력된다.

     

    오라클 안에 있는 데이터들을 JDBC를 통해 자바와 연결하여 출력한 화면이다.

     

     

    JDBC 사용 객체

    DriverManager

    DriverManager란 데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할로써 Class.forName() 메소드를 통해 생성되며 반드시 예외처리를 해야 한다.

    직접 객체 생성이 불가능하고 getConnection() 메소드를 사용하여 객체 생성이 가능하다.

     

     

    Connection

    Connection이란 특정 데이터 원본과 연결된 커넥션을 나타내며 Statement객체를 생성할 때도 Connection객체를 사용하여 createStatement() 메소드를 호출하여 생성한다.

    SQL문장을 실행시키기 전에 우선 Connection객체가 있어야 한다.

     

     

    Statement

    Statement란 Connection객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합 정의이다. Connection클래스의 createStatement() 메소드를 호출하여 얻어지며 생성된 Statement객체로 질의문장을 String객체에 담아 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL질의를 수행한다.

    728x90
    반응형
Designed by Tistory.