heywoo 2023. 1. 25. 21:01

JDBC(Java DataBase Connectivity)란?

자바에서 데이터베이스에 접근할 수 있게 해주는 Programming API

JDBC 사용 클래스

- DriverManager

데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할

Class.forName() 메소드를 통해 싱성되며 반드시 예외처리를 해야 함

직접 인스턴스 생성이 불가능하고 getConnection() 메소드를 사용하여 인스턴스 생성 가능

- Connection

특정 데이터 원본과 연결 된 커넥션을 나타냄

Statement 인스턴스를 생성할 때도 Connection 인스턴스를 사용하여 createStatement() 메소드를 호출하여 생성

SQL 문장을 실행시키기 전에 우선 Connecton 인스턴스가 있어야 함

- Statement

Connection 클래스의 createStatement() 메소드를 호출하여 얻어짐

생성된 Statement 인스턴스로 SQL 질의문을 String에 담에 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL 질의 수행

try {
	String query = "SELECT ID, LAST_NAME FROM EMP";
        stmt = conn.createStatement();
        rset = stmt.executeQuery(query);
 } catch (SQLException e) {
 			e.printStackTrace();
 }

 

- preparedStatement

Connection 클래스의 preparedStatement() 메소드를 사용하여 인스턴스 생성

SQL 질의문을 위치홀더 (placeholder)인 ?로 표현되는 String으로 정의

PreparedStatement는 위치홀더라는 개념에 해당되는 인수가 많아서 특정 값만 바꾸어 여러 번 실행해야 할 때 유용

(Statement는 SQL문장을 매번 컴파일 하지만 PreparedStatement는 한번만 컴파일하므로 실행 속도가 빠름)

try {
	String query = "INSERT INTO MEMBER VALUES(?,?)";
	pstmt = conn.preparedStatement(query);
	pstmt.setString(1, id);
	pstmt.setString(2, password);
} catch (SQLException e) {
	e.printStackTrace();
}

 

- ResultSet

SELECT 문을 사용한 질의 성공 시 ResultSet을 반환

SQL 질의문에 의해 생성된 테이블을 담고 있으며 커서(cursor)로 특정 행에 대한 참조 조작

 

JDBC 코딩 절차

- DriverManager에 해당 DBMS Driver 등록

public static void main(String[] args) {
		
		/* DB 접속을 위한 Connection 인스턴스 생성
		 * 나중에 finally 블럭에서 사용하기 위해 try 블럭 밖에 미리 레퍼런스 변수를 선언함 */
		Connection conn = null;
		
		try {
			/* 1. 사용할 드라이버 등록 */
			Class.forName("oracle.jdbc.driver.OracleDriver");

 

- 해당 Driver로부터 Connection instance획득

		/* 2. DriverManager를 이용해 Connection 객체 생성 */
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "C##EMPLOYEE", "EMPLOYEE");
			
			System.out.println(conn);
			
		} catch (ClassNotFoundException e) {
			// 드라이버 클래스명에 오타가 있거나 라이브러리가 추가 되지 않았을 경우
			// 해당 클래스를 찾지 못했다는 exception 발생 가능
			e.printStackTrace();
		} catch (SQLException e) {
			// url, user, password 등이 올바르게 입력되지 않아서 연결 할 수 없으면 
			// exception 발생 가능
			e.printStackTrace();
		} finally {
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}

 

- 해당 Driver로부터 Connection instance 획득

	/* 1. Connection 생성 */
		Connection conn = getConnection();
		
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			/* 2. Statement 생성 */
			stmt = conn.createStatement();
			
			String empId = "207";
			String query = "SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE EMP_ID = '" + empId + "'";
			System.out.println(query);
			
			/* 3. executeQuery()로 쿼리문 실행하고 결과를 ResultSet으로 반환 */
			rset = stmt.executeQuery(query);
			
			/* 4. ResultSet에 담긴 결과 값을 컬럼 이름을 이용해서 꺼내오기 */
			if(rset.next()) {
				System.out.println(rset.getString(1) + ", " + rset.getString(2));
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			/* 5. 사용한 자원 반납 */
			close(rset);
			close(stmt);
			close(conn);
		}

- Statement에서 제공하는 메소드를 사용하여 SQL문 실행

 

		Connection conn = getConnection();

		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		try {
			
			/* PreparedStatement 객체는 생성 시에 sql 구문을 미리 전달한다. */
			pstmt = conn.prepareStatement("SELECT EMP_ID, EMP_NAME FROM EMPLOYEE");
			/* 쿼리 실행을 요청할 때는 sql 구문을 전달하지 않는다. */
			rset = pstmt.executeQuery();
			
			while(rset.next()) {
				System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
			close(conn);
		}