JDBC 기본코드 작성순서(?)

Jieun·2023년 3월 26일
0

전에 공부는 했지만 기억이 안나요............ 1도 모르겠어요 여서
다시다시 처음부터 공부를 해봅니다..... 화이팅🫠🫠🫠

1단계 : JDBC 객체 참조 변수 선언

Connection (conn)

  • DB정보를 담은 객체
  • DB와 Java사이를 연결해주는 통로 (Stream과 유사함)

Statement (stmt)

Connection을 통해 SQL문을 DB에 전달하여 실행하고,
생성된 결과(ResultSet, 성공한 행의 개수)를 반환(Java)하는데 사용되는 객체

ResultSet (rs)

SELECT 질의 성공시 반환되는데, 조회 결과 집합을 나타내는 객체

PreparedStatement (pstmt)

  • Statement의 자식으로 향상된 기능을 제공

  • ? 기호 (placeholder / 위치홀더)를 이용해서 SQL에 작성되어지는 리터럴을 동적으로 제어함

  • SQL ? 기호에 추가되는 값은
    숫자인 경우 '' 없이 대입.
    문자열인 경우 ''가 자동으로 추가되어 대입

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

💻 placeholder ? 쓰는 이유
기존방법으로 써도 되는데, 나중에 서브쿼리랑 문장 길어지면 복잡해서 간결하게 쓰려고 ?를 쓰는거임

2단계 : 참조 변수에 알맞은 객체 대입

2-1 : DB 연결에 필요한 Oracle JDBC Driver 메모리에 로드하기.
객체로 만들어 두기

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

2-2 : 연결 정보를 담은 Connection을 생성
DriverManager객체를 이용해서 Connection 객체를 만들어 얻어옴!

String type = "jdbc:oracle:thin:@";
String ip = "localhost";
String port = ":1521";

conn = DriverManager.getConnection(type + ip + port);

2-3. SQL 작성

String sql = "SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE";

2-4. Statement 객체 생성
Connection 객체를 통해서 생성

stmt = conn.createStatement();

2-5. 생성된 Statement 객체에 sql을 적재하여 실행한 후
결과를 반환 받아와서 rs 변수에 저장

rs = stmt.executeQuery(sql);

✔️ Statement 객체 사용 시 순서 (위에 순서대로)
SQL 작성(2-3) → Statement 생성(2-4) → SQL 수행 후 결과 반환(2-5)

✔️ PreparedStatement 객체 사용 시 순서 (아래 코드 순서대로)
SQL 작성 → PreparedStatement 객체 생성(?가 포함된 SQL을 매개변수로 사용) →
→ ?(위치홀더)에 알맞은 값 대입 → SQL 수행 후 결과 반환

// ?(위치홀더) 사용하여 SQL 작성 (2-3)
String sql = "SELECT EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE,\r\n"
					+ "NVL(DEPT_TITLE, '부서없음') DEPT_TITLE,\r\n"
					+ "JOB_NAME, SALARY\r\n"
					+ "FROM EMPLOYEE\r\n"
					+ "LEFT JOIN DEPARTMENT ON (DEPT_ID = DEPT_CODE)\r\n"
					+ "JOIN JOB USING (JOB_CODE)\r\n"
					+ "WHERE EMP_NO = ?";
                    
// PreparedStatement 객체 생성 (2-4)                 
pstmt = conn.prepareStatement(sql);

// ?(위치홀더)에 알맞은 값 대입 	
pstmt.setString(1, empNo);	

// SQL 수행 후 결과 반환 (2-5)
rs = pstmt.executeQuery();

3단계 : SQL을 수행해서 반환 받은 결과(ResultSet)를 한행씩 접근해서 컬럼 값 얻어오기

💻 rs.next()

rs가 참조하는 ResultSet 객체의 첫번째 컬럼부터 순서대로 한 행씩 이동하며
다음 행이 있을경우 true 반환 / 없으면 false 반환

조회결과가 1개면 if, 두개이상이면 while문

while(rs.next()) {
// 참일경우
          String empId = rs.getString("EMP_ID");
          String empName = rs.getString("EMP_NAME");
          int salary = rs.getInt("SALARY");
          Date hireDate = rs.getDate("HIRE_DATE");
} catch(ClassNotFoundException e) {
// false 반환창
System.out.println("JDBC 드라이버 경로가 잘못 작성되었습니다. ");

} catch(Exception e) {
         e.printStackTrace();

4단계 : 사용한 JDBC 객체 자원 반환 ( close() )

ResultSet, Statement, Connection 닫기
(생성 역순으로 닫는 것을 권장)

} finally {
     try {
            if( rs != null ) rs.close();
            if( stmt != null ) stmt.close();
            if( conn != null ) conn.close();
         } catch (Exception e) {
                    e.printStackTrace();


✔️ 전체 구문 정리

public class JDBCExample {
	public static void main(String[] agrs ) {
    
    // 1단계 : JDBC 객체 참조 변수 선언
    Connection conn = null; 
    Statement stmt = null;
    ResultSet rs = null;
    
    
    try {
    	// 2단계 : 참조 변수에 알맞은 객체 대입
        
        //2-1. DB 연결에 필요한 Oracle JDBC Driver 메모리에 로드하기
        Class.forName("oracle.jdbc.driver.OracleDriver");
        
   
    	// 2-2. 연결 정보를 담은 Connection을 생성
		// -> DriverManager객체를 이용해서 Connection 객체를 만들어 얻어옴!
        String type = "jdbc:oracle:thin:@";
        String ip = "localhost";
        String port = ":1521";
        String sid = ":XE";
        String user = "je";
        String pw = "je1234";
        
        // DriverManager : 
		// 메모리에 로드된 JDBC 드라이버를 이용해서 Connection 객체를 만드는 역할
        conn = DriverManager.getConnection(type + ip + port + sid, user, pw);
        
        // 2-3. SQL 작성
		// ** JAVA에서 작성되는 SQL은 마지막에 ;(세미콜론) 찍지 않기! **
        String sql = "SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE";
        
        // 2-4. Statement 객체 생성
		// -> Connection 객체를 통해서 생성
        stmt = conn.createStatement();
        
        // 2-5. 생성된 Statement 객체에 sql을 적재하여 실행한 후 
		//결과를 반환 받아와서 rs 변수에 저장
        rs = stmt.executeQuery(sql);
        //executeQuery() : SELECT문 수행 메서드, ResultSet반환
        


 		// 3단계 : SQL을 수행해서 반환 받은 결과(ResultSet)를 
		//   	   한행씩 접근해서 컬럼 값 얻어오기

 
        while(rs.next()) {
        //rs.next() : rs가 참조하는 ResultSet 객체의
		//		     첫번째 컬럼부터 순서대로 한 행씩 이동하며
		//   		 다음 행이 있을경우 true 반환 / 없으면 false 반환
        
        					//rs.get 자료형("컬럼명")
        	String empId = rs.getString("EMP_ID");
            // 현재 행의 "EMP_ID" 문자열 컬럼의 값을 얻어옴
            String empName = rs.getString("EMP_NAME");
            int salary = rs.getInt("SALARY");
            Date hireDate = rs.getDate("HIRE_DATE");
            
            // 조회 결과 출력
            System.out.printf("사번 : %s / 이름 : %s / 급여 : %d / 입사일 : %s\n",
									empId, empName, salary, hireDate.toString() );
    
   
    } catch(ClassNotFoundException e) {
     // 클래스명 잘못작성하면 나는 오류 잡는 예외 구문 
    	System.out.println("JDBC 드라이버 경로가 잘못 작성되었습니다. ");
    
   } catch(SQLException e) {
   // SQLException : DB 관련 최상위 예외 (== 데이터베이스에 관련된 모든 예외)
   		e.printStackTrace();
        
        // 4단계 : 사용한 JDBC 객체 자원 반환 ( close() )
		// ResultSet, Statement, Connection 닫기 (생성 역순으로 닫는 것을 권장)
       
       
       
   } finally {
   
   		try {
				if( rs != null ) rs.close();
				if( stmt != null ) stmt.close();
				if( conn != null ) conn.close();
				
			} catch(SQLException e) {
				e.printStackTrace();
			}
         
         }
	}
}
   
profile
👩‍💼👩‍💼➡️➡️➡️👩‍💻👩‍💻 생산자의 삶을 살기 위해 개발공부중

0개의 댓글