DB - JDBC

이상해씨·2022년 9월 14일
0

웹 풀스택(JAVA)

목록 보기
44/54

✔ JDBC

1. JDBC 기초

  • JDBC(Java DataBase Connectivity)
    • 자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이루어진 API. ANSI SQL(1999) 지원. (표준)
    • SQL 문을 실행할 수 있는 함수 호출 인터페이스

◾ JDBC 특징

  • DBMS 종류에 독립적인 자바 프로그래밍 가능.
  • 데이터베이스가 달라지더라도 동일한 API 사용 가능(드라이버 및 URL 수정만 하면 가능.)
  • 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS에 독립적인 특성을 가짐.

◾ JDBC 기능

  • 데이터 베이스 연결 설정.
  • SQL 문장 DBMS에 전송.
  • SQL 문장 전송 후 결과 응답 확인 가능.

◾ JDBC Interface

  • Database를 만드는 업체에게 제공되는 인터페이스
    • 업체에게 제공되는 인터페이스를 각각의 DBMS업체들이 구현한 것 : 드라이버.
  • 프로그래머에게 제공되는 인터페이스
    • SQL 패키지가 제공하고 있는 라이브러리로 이를 활용해 DB 프로그램 작성 가능.

◾ JDBC 관련 클래스

  • JDBC API : java.sql package

  • DriverManager
    • JDBC API에서 제공되는 구상(Concrete) 클래스.
      • 구상 클래스 : new 키워드로 생성할 수 있는 클래스
    • JDBC Driver 인터페이스를 구현한 객체 관리.
    • JDBC URL을 이용해 메모리에 로드 된 Driver 검색 -> Connection 연결.
  • Driver(interface)
    • 드라이버에 대한 정보.
    • 모든 드라이버가 반드시 구현해야 하는 인터페이스
    • 드라이버의 버전이나 연결에 대한 정보 메서드.
  • Connection(interface)
    • 데이터베이스에 대한 하나의 세션 표현.
      • 세션 : 하나의 클라이언트가 서버에 요청을 하기 위해 연결을 맺은 상태.
    • DriverManager 클래스의 getConnection()메서드를 이용해 획득.
    • 기본적으로 setAutoCommit(true)로 설정.
      • 직접 설정하기 위해서 setAutoCommit(false)로 설정.
  • Statement(interface)
    • SQL 문장을 실행하고 결과 반환을 위해 사용.
    • excute(String sql) : DML, Query(select), DDL 등 구분 없이 수행.
      • 결과가 ResultSet이면 true, DML이거나 특별한 결과가 없다면 false.
    • excuteQuery(String sql) : SELECT 쿼리 수행시 사용.
    • excuteUpdate(String sql) : 주로 DML(INSERT, UPDATE, DELETE) 쿼리 수행시 사용.
    • SQL Injection에 취약하므로 실무에서 사용 X : PreparedStatement 사용
      • Statement가 주어진 SQL을 그대로 전달하 것을 이용한 공격.
      • 예시) 로그인 쿼리문에 임의의 SQL을 삽입하는 경우 등.
  • PreparedStatement(interface)
    • 동일한 SQL 문장이 여러 번 반복적으로 수행될 때 사용하는 객체.
    • 대용량의 문자나 바이너리 타입의 데이터(이미지, 사운드 등) 저장 가능.
    • SQL 문장이 미리 컴파일 되어 PreparedStatement 객체에 저장.
      • clearParameters()를 통해 Statement에 남겨진 값 초기화.
    • excuteQuery(String sql) : SELECT 쿼리 수행시 사용.
    • excuteUpdate(String sql) : 주로 DML(INSERT, UPDATE, DELETE) 쿼리 수행시 사용.
  • ResultSet(interface)
    • 쿼리에 대한 결과값 처리.
    • 첫 번째 레코드보다 바로 이전을 가르킴.
    • next() : ResultSet 객체의 커서 이동.
    • get___(index or name) : 해당 커서의 데이터 획득.

◾ JDBC 주요 인터페이스

  • DriverManager는 여러 Connection 관리
  • Connection은 Statement를 통해 여러 질의 가능.
  • 하나의 Statement는 하나의 ResultSet만 가능.
  • Connection, Statement, ResultSet은 close해야하는 resource

2. JDBC Programming

◾ 개발 순서

  1. JDBC Driver Loading.
  2. DBMS 연결 : Connection 생성.
  3. SQL 실행 준비 : Statement/PreparedStatement 생성.
  4. SQL 실행.
  • DML : INSERT, UPDATE, DELETE.
  • DQL(SELECT) : 실행 결과 ResultSet 객체.
  1. DBMS 연결 끊기.
  • 반드시 사용한 요소들을 close 해야 함

◾ JDBC 예시

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

public class JDBCPreparedStatementTest {
	public static void main(String[] args) {
		try {
			// 1. 드라이버 로딩.
			// - 드라이버를 메모리에 적재하는 작업
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("드라이버 로딩 완료...");

			// 2. Connection 객체 생성.
			String url = "jdbc:mysql://127.0.0.1:3306/ssafydb?serverTimezone=Asia/Seoul&useUniCode=yes&characterEncoding=UTF-8";;
			Connection conn = DriverManager.getConnection(url, "ssafy", "ssafy");
			System.out.println(conn.getClass().getName());
			System.out.println("Connection 완료...");

			/** PreparedStatement **/
			// 3. 실행할 쿼리문 작	성
			String sql = "SELECT employee_id, first_name, job_id, salary FROM employees WHERE employee_id = ?;";
			
			// 4-1. 쿼리문 실행을 위해 PreparedStatement 객체 생성.
			PreparedStatement stmt = conn.prepareStatement(sql);
			
			// 4-2. 물음표 채워 넣기.
			stmt.setInt(1, 100);
			
			// 5. 쿼리문 실행.
			// - SELECT : executeQuery()
			ResultSet result = stmt.executeQuery();
			/** PreparedStatement **/
            
            /** Statement **/
            // 3. 실행할 쿼리문 작성
			String sql = "SELECT employee_id, first_name, job_id, salary FROM employees WHERE employee_id = 100;";
			
			// 4. 쿼리문 실행을 위해 Statement 객체 생성.
			Statement stmt = conn.createStatement();
			
			// 5. 쿼리문 실행.
			// - SELECT : executeQuery(sql)
			ResultSet result = stmt.executeQuery(sql);
            
			// 6. 실행 결과 출력.
			while(result.next()) {
				StringBuilder sb = new StringBuilder();
				sb.append(result.getInt(1)).append("\t")
				  .append(result.getString(2)).append("\t")
				  .append(result.getString(3)).append("\t")
				  .append(result.getString(4));
				System.out.println(sb);
			}
			/** Statement **/
            
			// 7. DBMS와 연결 끊기
			// - 불러온 역순으로 연결 끊기.
			result.close();
			stmt.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
profile
후라이드 치킨

0개의 댓글