본문 바로가기

기타

[JDBC] JDBC란? / JDBC 사용객체 / JDBC 처리, 동작순서

JDBC (Java Database Connectivity)

-Java가 제공하는, Java프로그램 내에서 Database로 접근할 수 있도록 해주는  표준 인터페이스( 프로그래밍 API)
    ---> 자바프로그램 내에서 SQL문을 실행하기 위한 자바 API
  - 자바를 이용한 데이터베이스 접속과 SQL문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약
 -- > 자바 프로그래밍 언어로 관계형 데이터베이스에 접속하여 데이터를 주고받을 수 있도록 지원하는 자바 표준 API
- JDBC API는 자바 프로그래밍 언어로 작성된 인터페이스, 클래스, 및 예외 클래스들의 집합으로 구성
 - SQL을 이용해 자바 프로그래밍 언어로 데이터베이스 응용 프로그래밍을 작성할 수 있도록 지원
- 벤더 독립적 : 서로 다른 데이터베이스일지라도 일관적인 방법으로 관계형 데이터베이스에 접근 가능함 
  (JVM이 설치된 모든 종류의 DBMS에서 실행 가능)
-  역할 
    1) Java코드를 통해 DB 서버 접속 
    2) SQL문을 구성하고 DB서버에서 실행 
    3) DB서버에서 처리한 결과 가져오기

 * JDBC Driver

 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것

 

https://coderzpy.com/what-is-jdbc/

 

 JDBC 사용객체 

DriverManager JDBC 드라이버를 통해서 커넥션을 만드는 역할
Class.forName() 메소드를 통해 생성, 예외처리 필수
getConnection()메소드를 호출하여 Connection객체를 반환받음
Connection 특정 데이터 원본과 연결된 객체
DB의 연결정보를 담고 있는 객체   (ip주소, port번호, 계정명, 비밀번호)
Statement   해당 DB에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체 
   --> 특징: 완성된 SQL문을 실행할 수 있는 객체임
  Connection객체에 의해 프로그램에 구현되는 일종의 메소드 집합 
  Connection클래스의 createStatement()를 호출하여 객체 생성
  Statement객체로 SQL문을 String객체로 담아 인자값으로 전달하여 질의 수행
Result Set SELECT문을 사용한 질의 성공시 반환되는 객체
(만일 실행한 SQL문이 SELECT문일 경우 조회된 결과가 result set객체에 들어감)
SQL 질의에 해당하는 결과를 담고 있으며 '커서(CURSOR)'를 이용하여  특정 행에 대한 참조를 조작

  

JDBC 처리 / 동작순서 (중요!)

SELECT문 DML문
1. 변수 세팅
Conntection, Statement, ResultSet or int
2. 실행할 SQL문 만들기(완성된 형태) 
String sql =  ~~
3. JDBC Driver 등록:
해당 DBMS가 제공하는 클래스 등록
Class.forName() + 예외처리
(ClassNotFoundException: 드라이버 경로 오류
ojdbc6.jar가 누락되거나, 추가했지만 오타가 있을 경우) 
 4. Connection객체 생성:
접속하고자 하는 DB정보를 입력하여 DB에 접속하면서 생성
DriverManager.getConnection(url, 계정명, 비밀번호) + 예외처리
(SQL Exception: url, 계정명, 비밀번호 오류)
---> 반환받은 connection 객체를 받아줌

5. Statement 객체생성: 
Connection객체를 이용하여 생성
stmt = connection객체.createStatement();
6. SQL문을 전달하면서 실행:
Statement객체를 이용하여 SQL문 실행
(DB에 완성된 SQL문을 전달하고, 실행하고, 결과받기) 

stmt.execute~();
executeQuery()   executeUpdate() 
7. 결과받기   
resultSet/int = stmt.execute~();  

resultSet객체 (조회데이터가  담겨있음)으로 받음 

       (resultSet에 담겨있는 데이터를 한줄씩 추출 후
vo객체에 담음)
int(처리된 행수)로 받음 
--->  트랜잭션처리
(성공시 commit, 실패시 rollback)
8. 자원반납
  close메소드를 이용하여 자원이 생성된 역순으로 반납 
Finally 블럭 내 + 예외처리
(SQLException)
9. 결과반환 (to Controller) 
vo  객체 반환   int(처리된 행수) 반환

 

 

<DML문> : statement의 execute 메소드 수행결과가 int형으로 반환, 트랜젝션 처리 필수 

package com.cc.test;

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

public class TestRun {
	public static void main(String[] args) {
				
//1. 변수세팅
//--> jdbc 관련내용은 java.sql 패키지에서 import
		int result = 0;
		Connection conn = null; //import java.sql.Connection;
		Statement stmt = null; // import java.sql.Statement;
		

	
		
// 2. 실행 sql문 만들기 ("완성형태"로 만들기)
	    String sql =  "INSERT INTO TEST VALUES(1, 'JDBC', SYSDATE) ";
			     
// 3. JDBC DRIVER등록 -- Class.forName(); , 예외처리필수 
	     try {
		 		Class.forName("oracle.jdbc.driver.OracleDriver");
				System.out.println("driver등록 성공!");
			
// 4. Connection 객체 생성 
// -- DriverManager 클래스의 getConnection()호출 , DB 연결(url, 계정명, 비밀번호)
		
            	conn = DriverManager.getConnection
                ("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC"); // 반환형 => Connection
				System.out.println("Connection 객체생성");
			
// 5. Statement객체 생성 -- Connection클래스 createStatement()호출 
// 접속정보가 conn에 담겨 있으니, conn 객체를 가지고 객체를 만든다
				stmt = conn.createStatement(); // 반환형 -> Statement(쿼리도 보내고 결과도 받아옴)
				System.out.println("Statement 객체생성");
// 6. 쿼리문 전달 및 실행  
// 7. 결과받기 executeUpdate();
//  dml: 처리된 행수반환 (int 타입)
//  select절: result set 반환 (Result set 타입)
        
        		result = stmt.executeUpdate(sql);  // 결과가 정수로 옴 (행수)
                
// dml: 트랜젝션 처리  
		     if (result >0) { // 성공했을 경우 commit (커밋,롤백담당은 conn)
		    	 conn.commit(); // commit() 호출
		     } else {
		    	 conn.rollback(); // rollback() 호출		    	 
		     }		
			
			
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		} catch (SQLException e) {
			
			e.printStackTrace();
            
// 8. 자원반납 : try-catch문 내, 객체 생성의 역순으로
		} finally { 
			try {
				stmt.close();
				conn.close();				
				
			} catch (SQLException e) {	
				e.printStackTrace();
			}			
		}  
	     
 // 9. 결과반환
	     if (result>0) {
	    	 System.out.println("insert 성공");
	     } else {
	    	 System.out.println("insert 실패");
    	 
	     }         
     }   
}

<SELECT문> :statement의 execute메소드 수행결과가 ResultSet타입으로 반환 

public ArrayList<Member> selectAll() {
		// 1. 변수선언
		ArrayList<Member> list = new ArrayList();
        
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null; // sql문의 결과(Result set)를 받아줄 변수
		
		// 2. 실행에 필요한 완성된 SQL문 
		String sql ="SELECT * FROM MEMBER" ;
		
		// 3. JDBC드라이버 등록
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");				
		      conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe" ,
	                     "JDBC","JDBC");
		
		// 4. Statement객체 생성
			stmt = conn.createStatement();
		// 5. sql문 실행 후 결과 돌려받기
			rset = stmt.executeQuery(sql);
		// 6. rset으로 받은 resultset을한행씩 빼서 member형 객체에 저장하기
		// ResultSet.next메소드: 커서를 한 줄 아래로 옮겨주고 해당 행이 존재할 경우 t, 아니면 f반환
			  while (rset.next()) {
	    // 현재 rset의 커서가 가리키고 있는 행의 데이터를 하나씩 추출한 후 담아줄 member 객체 생성
				  Member m = new Member();
		// rest.getInt(컬럼명or 컬럼순번)
		// rset.getString (컬럼명or 컬럼순번)
	    // rset.getDate(컬럼명or 컬럼순번)
        
	     // 컬럼명은 대소문자를 구분하지 않음
		// 권장사항: 컬럼명을 대문자로 쓰는 것을 권장!
				  
				  m.setUserNo(rset.getInt("USERNO")); //현재 커서가 가리키고 있는 행의 "USERNO"값 추출
				  m.setUserId(rset.getString("USERID"));
				  m.setUserPwd(rset.getString("USERPWD"));
				  m.setUserName(rset.getString("USERNAME"));
				  m.setGender(rset.getString("GENDER"));
				  m.setAge(rset.getInt("AGE"));
				  m.setEmail(rset.getString("EMAIL"));
				  m.setPhone(rset.getString("PHONE"));
				  m.setAddress(rset.getString("ADDRESS"));
				  m.setHobby(rset.getString("HOBBY"));
				  m.setEnrollDate(rset.getDate("ENROLLDATE"));
		// 한 행에 대한 모든컬럼의 값을 Member객체에 옮겨담기 성공
		//list에 해당 맴버객체를 담아주면 끝
				  list.add(m);
			  }			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}				
		}	
		// 결과반환(조회 결과를 추출한 후 담은 list 객체)
				return list;
	}

 ojDBc6.jar 

 프로젝트 선택 후 마우스 우클릭 -> properties -> JavaBuildPath -> Libraries -> Add External JARs   -> c:\dev\ojDBc6.jar 선택 -> apply -> apply and close References Libraries에 ojDBc6 추가여부 확인   ==> 해당 작업 미수행시 ClassNotFoundException 발생