본문 바로가기

JAVA

JDBC, JAVA-SQL 연동 : 자바 - 데이터베이스(DB) 연결

* JDBC(Java Database Connectivity)란?
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API.
자바 언어로 데이터베이스 데이터 조작 가능하도록한다.
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을 제공한다.
by 위키백과

* 자바 API
JDBC는 JAVA 애플리케이션에서 데이터베이스에 접근하기 위해 자바 API 사용, 데이터 베이스에 연동한다.
Oracle, MS SQL, MySQL 등 각각의 데이터베이스 관리 시스템(DBMS)에 맞춘 JDBC 드라이버를 구현해 제공한다.

* JDBC 동작 흐름
JAVA 애플리케이션 → JDBC API → JDBC 드라이버 → 데이터베이스

* JDBC API 동작 흐름
JDBC 드라이버 로딩 → Connection 객체 생성 → Statement 객체 생성 → SQL문 수행(Query 실행)
→ ResultSet 객체에 결과 받아, 데이터 조회 → 객체 Close : 객체 생성할 때와 역순 (ResultSet, Statement, Connection 객체 순서)

 

JAVA와 SQL을 연결하기 위한 환경 세팅

 

1. ojdbc6.jar 파일 복사

    DBMS 실습을 위한 작업환경을 구성할 때 설치했던 Oracle XE 파일에 위치한 ojdbc6.jar 파일을 복사한다.

    나의 경우에는 아래와 같은 주소에 위치해 있었다.

    C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

 

2. ojdbc6.jar 파일 java 설치파일에 붙여넣기

   다운로드받은 자바 설치파일에 넣어준다.

   내 경우 경로는 아래와 같았으나

   C:\dev_tool
   구글 검색을하면 주로 jre폴더의 lib에 넣어주는 듯 하다.

   C:\dev_tool\java-1.8.0\jre\lib

 

3. 이클립스에서 Libararies에 추가

   마우스 우클릭 후 properties에서 Java Build Path →  Add Exterbak JARs → ojdbc6.jar 파일 위치 추가

 

 

연동을 위한 자바 코드

1) JDBC Driver 등록

   해당 DBMS(오라클)가 제공하는 클래스 등록

 

2) Connection 생성

   연결하고자하는 db정보를 입력해서 해당 db와 연결할 수 있는 객체 생성

 

3) Statement 생성

   Connection 객체를 이용해서 생성(sql문 실행 및 결과 받는 객체)

   자바에서 SQL로 보내고 받기 위한 통로

 

4) sql문 전달하며 실행

   Statement 객체를 이용해서 sql문 실행

 

5) 결과받기 : 

> DML문 실행(INSERT, UPDATE, DELETE)(6-1) => int(행 수가 반환되기 때문에 int 로 받는다.)

> SELECT 문 실행(6-2) => ResultSet 객체 (조회된 결과를 담아준다.)

 

6-1) 트랜잭션 처리(성공했다면 commit, 실패했다면 rollback 실행)

6-2) ResultSet 객체에 담겨있는 데이터를 하나씩 추출해서 옮겨 담기[+ ArrayList에 담기]

 

7) 사용 끝난 JDBC용 객체를 반드시 자원 반납 (close) => 생성 역순으로

 

코드 예시 1 )

내가 실행할 sql문이 DML(insert, update, delete)문 : Statement만 이용, ResultSet 노필요,

(Test용 Table 이용 : TNO, TNAME, TDATE 컬럼 유)

  • result 에 결과값(처리된 행 수) int로 받아줌(ResultSet 없음) : result = stmt.executeUpdate(sql);
		// 1. 각자의 pc(localhost)에 jdbc 계정 연결 후 test 테이블에 insert 하기
		// insert => 처리된 행 수 (int) => 트랜잭션 처리
        
     	 	// 변수 세팅
		int result = 0; // 결과(처리된 행 수)를 받아줄 변수
		Connection conn = null; // DB 연결정보 보관 객체
		Statement stmt = null; // sql문 전달, 실행 후 결과를 받는 객체

		Scanner sc = new Scanner(System.in);
		System.out.print("번호 : ");
		int num = sc.nextInt();
		sc.nextLine();
		
		System.out.print("이름 : ");
		String name = sc.next();
		sc.nextLine();
        
      		  // 실행할 sql문 만들기
      		  String sql = "INSERT INTO TEST VALUES(" + num + ", '" + name + "', SYSDATE)";
        
    		    try {
			// 1) JDBC Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 오류나면? ojdbc6.jar 파일 추가하지 않았을까 확인 또는 오타
          		System.out.println("OracleDriver 등록성공");
		    
			// 2) Connection 생성("url", "계정명", "비밀번호")
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
			
			//  3) Statement 생성
			stmt = conn.createStatement();
			
			// 4, 5) sql문 전달하며 실행 후 결과 받기(처리된 행 수)
     		       // 내가 실행할 sql문이 DML(insert, update, delete)문 일 때 -> stmt.executeUpdate(sql문)
		       // 내가 실행할 sql문이 select문 -> stmt.executeQuery(select문) : ResultSet
			result = stmt.executeUpdate(sql);

			// 6) 트랜잭션 처리
			if(result > 0) { // 요청한 sql문 성공
				conn.commit();
			} else {
				conn.rollback(); // 요청한 sql문 실패
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 7) 다 쓴 jdbc용 객체 자원반납(생성과 역순으로)
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
        
       		// 요청한 sql문 성공여부: 행 수가 반환되기 때문에 int 로 받는다
		if(result > 0) { // 요청한 sql문 성공
			System.out.println("데이터 삽입 성공");
		} else {
			System.out.println("데이터 삽입 실패");			
		}

 

 

코드 예시 2)

내가 실행할 sql문이 SELECT문 :  ResultSet 필요

(Test용 Table 이용 : TNO, TNAME, TDATE 컬럼 유)

  •  ResultSet 객체에 실행 결과값 받기 (int result 없음)  : rset = stmt.executeQuery(sql);
		// 2. 내 pc db상의 jdbc계정에 TEST 테이블 데이터 전체 조회
		// select문으로 데이터 가져옴 => ResultSet(조회된 데이터가 담김) => ResultSet에서 데이터 추출
        
        // 필요 변수 세팅
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		// 실행할 sql문 작성
		String sql = "SELECT * FROM TEST";
        
        try {
        	// 1) JDBC Driver 등록 - 드라이버 불러와라
            Class.forName("Oracle.jdbc.driver.OracleDriver");
            System.out.println("OracleDriver 등록성공");
            
            // 2) Connection 생성("url", "계정명", "비밀번호") - sql 계정에 로그인해라
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521Lxe", "JDBC", "JDBC");
            
            // 3) Statement 생성
            stmt = stmt.executeQuery(sql);
            
            // 4, 5) sql문 전달해서 실행 수 결과 받기(ResultSet)
            rset = stmt.executeQuery(sql);
            
        	while (rset.next()) {
           	// rset.next() => rset의 다음행이 들어있는지 없는지 확인 후 결과반환 + 한 행 내려가서 다시 확인
		//		 첫 시작은 제목줄 : 결과 유무는 true, false
		// 현재 참조하는 rset으로부터 어떤 컬럼에 해당하는 값을 어떤 타입으로 추출할건지 제시해줘야
		// db의 컬럼명 제시(대소문자 구별 x)
				int tno = rset.getInt("TNO");
				String tname = rset.getString("TNAME");
				Date tdate = rset.getDate("TDATE");
				
				System.out.println(tno + ", " + tname + ", " + tdate);	
			}
            
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 7) 다 쓴 jdbc용 객체 자원반납(생성과 역순으로)
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}