JDBC가 무엇이고 어떻게 사용하는가

JDBC

목록 보기
1/1
post-thumbnail

JDBC란?

Java 응용 프로그램에서 DBMS와 연동하기 위한 표준 API

  • JDBC API를 이용함으로써 DBMS의 종류에 상관없이 동일한 방법으로 데이터베이스 접속 및 질의 실행 가능함.

  • DBMS 접속 및 이용을 위한 interface와 class들을 제공함
    - DBMS vendor에서 제공하는 JDBC Driver를 통해 구현됨.

위의 그림과 같이 자바 어플리케이션과 데이터 베이스를 연동하기 위해 JDBC API를 이용한다는 의미
Oracle , MySQL등 DB의 종류는 상관없음'



JDBC API 사용 절차

준비
1. JDBC관련 Package import
2. JDBC Driver 로딩 및 등록
3. DBMS와의 Connection 획득

사용
4. SQL문 수행을 위한 Statement 객체 생성
5. Statement 객체를 사용하여 SQL 문 수행(DBMS에 질의 전송 및 수행)
6. DBMS 응답 사용(ResultSet 또는 return 값 이용)

종료
7. 자원 반납(ResultSet, Statement, Connection 등)

준비

1. JDBC Package import

  - java 프로그램 내에서 java.sql package를 import

import java.sql.*;

2. JDBC Driver Loading 및 등록

Class.forName(DRIVER_CLASS_NAME)

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

DRIVER_CLASS_NAME에 해당하는 클래스를 runtime에 동적으로 로딩

  • 클래스 이름은 프로그램에서 문자열로 지정(변경 가능)

메모리에 Driver 객체를 생성하고 DriverManager 객체에 등록

JDBC Driver 클래스 예

  • Oracle: oracle.jdbc.driver.OracleDriver
  • MySQL: com.mysql.jdbc.Driver 또는 org.git.mm.mysql.Driver

3. DBMS와의 연결 획득

방법1: DriverManager 이용

Connection conn  = DriverManager.getConnection(url, user, passwd);
데이터베이스 접속에 필요한 Connection 객체를 구한다.

url : JDBC를 사용하여 접속할 DBMS Server와 데이터베이스의 주소 표현
- 형식: jdbc:[DBMSServer주소:port번호]:[데이터베이스식별자]

user, passwd : 접속할 데이터베이스 사용자 계정의 이름과 비밀번호

방법2: javax.sql.DataSource Interface이용

Data source를 나타내며, 그것에 대한 연결을 생성하는 factory기능 제공

DriverManager의 대안으로 connection 객체를 구하기 위한 더 좋은 방법임

일반적으로 Application Server(ex. Tomcat)에서 클래스 구현 및 객체 생성

  • Database connection pooling(DBCP)기능 지원

  • Java Naming and Directory Interface(JNDI) 서비스를 통해 DataSource 객체에 대한 참조를 제공

    Application에서는 JNDI서비스를 검색(lookup)하여 DataSource객체 획득 및 사용

    import javax.naming.*;
    import javax.sql.*;
    Context ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
    Connection conn  = ds.getConnection();

사용

4. Statement 객체 생성

정적인 SQL문을 실행하고 그 결과를 반환하기 위해 사용되는 객체
Connection#createStatement()

	Statement st = conn.createStatement();

5. Statement객체를 이용하여 SQL문 실행

질의(Select문)실행

ResultSet rs = stmt.executeQuery(query);

query : 실행할 SQL문
ResultSet 타입의 객체를 반환

DML(INSERT, UPDATE, DELETE)실행

int recordCount = stmt.executeUpdate(dml);

dml: INSERT, UPDATE, DELETE 문

삽입/변경/삭제된 행의 개수를 반환

boolean execute(String sql)

  • 질의, DML, DDL 모두 실행 가능

    • 질의 실행 후 결과가 있으면 true반환 -> stmt.getResultSet()으로 ResultSet구함

    • DML실행 후 false반환-> stmt.getUpdateCount()로 행의 개수 구함

6. DBMS 응답 사용

  • ResultSet
    - Statement.executeQuery()의 실행 결과로 반환되는 행들의 집합을 저장

    • 내부적으로 커서(cursor)를 사용하여 결과 행들을 순차적으로 접근
  • ResultSet.next()

    • ResultSet에 저장된 행들을 커서가 순서대로 가리키도록 함
      • 최초 호출 시 첫번 째 행을 가리키고, 이후 호출될 때 마다 커서를 다음 행으로 이동시킴.
    • 가리킬 행이 있으면 true 없으면 false를 반환

ResultSet에서 현재 커서 위치의 컬럼 값 읽는 법

rs.getString(컬럼명)
컬럼명에 해당하는 필드를 문자열로 읽어 반환
rs.getString(n)
n이 숫자인 경우 질의의 SELECT절에 지정된 n번째 컬럼값을 반환

이 외에도 getCharacter(컬럼명) getInt(컬럼명) getLong(컬럼명) 등등 이 있음.

종료

7. 자원 반납

데이터베이스 작업이 끝나면 각 자원을 반드시 반환해야함

if(rs != null){  //ResultSet 객체 존재
	try{rs.close();}
    catch(SQLException ex){...}
 }
 
 if(stmt != null){  //Statement 객체 존재
	try{stmt.close();}
    catch(SQLException ex){...}
 }
 
 if(conn != null){ //Connection 객체 존재
	try{conn.close();}
    catch(SQLException ex){...}
 }

JDBC Program Example

package jdbc.examples;

import java.sql.*;									// 1. JDBC 관련 package import

public class StmtEx {
	public static void main(String args[]) 
	{
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		String url = "jdbc:oracle:thin:@dblab.dongduk.ac.kr:port번호/orclpdb";		
		String user = "사용자 계정 이름;
		String passwd = "비밀번호";
			
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	// 2. JDBC Driver 로딩 및 등록
		} catch (ClassNotFoundException ex) {
			ex.printStackTrace();
		}
		
		String query = "SELECT empno, ename, dname "
				     + "FROM emp JOIN dept ON emp.deptno = dept.deptno";						 
	
		try {			
			conn = DriverManager.getConnection(url, user, passwd);	// 3. DBMS와의 연결 획득
			stmt = conn.createStatement();				// 4. SQL문을 위한 Statement 객체 생성 
			rs = stmt.executeQuery(query);				// 5. Statement 객체를 사용하여 SQL문 실행
			
			System.out.println("EmpNo      Name          Dept");
			System.out.println("--------------------------------");
			while (rs.next()) {							// 6. DBMS 응답 사용
				int empNo = rs.getInt("empno");
				String name = rs.getString("ename");
				String dname = rs.getString("dname");			
				System.out.printf("%d %10s %15s\n", empNo, name, dname);
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {										// 7. 자원 반납
			if (rs != null) {
				try { 
					rs.close(); 
				} catch (SQLException ex) { ex.printStackTrace(); }
			}
			if (stmt != null) { 
				try { 
					stmt.close(); 
				} catch (SQLException ex) { ex.printStackTrace(); }
			}
			if (conn != null) { 
				try { 
					conn.close(); 
				} catch (SQLException ex) { ex.printStackTrace(); }
			}
		}	
	}	
}

Statement 객체는 정적 SQL문만 실행할 수 있어서 한계 존재
이를 극복하고자 PreparedStatement 객체가 나옴

이에 대한 자세한 설명은 다음 글에 작성함.

0개의 댓글