WEB | JDBC

바다·2023년 5월 22일
0

WEB

목록 보기
3/12
post-thumbnail

JDBC (Java DataBase Connectivity)


JDBC(Java Database Connectivity)는 자바를 사용하여 데이터베이스에 접속하고 데이터를 관리하기 위한 API(응용 프로그래밍 인터페이스)이다. JDBC를 사용하면 자바 애플리케이션에서 다양한 데이터베이스에 접속하고 SQL 문을 실행하여 데이터를 조작할 수 있다.

JDBC Class 활용

DriverManager

  • 데이터 원본에 JDBC driver를 통하영 Connection을 만드는 역할을 한다.
  • Class.forName() method를 통해 생성된다.
  • 반드시 예외 처리를 해야 한다.
  • 직접 instance 생성이 불가하고, getConnection() method를 사용하여 instance를 생성할 수 있다.

JDBC 드라이버(JDBC Driver)

  • 특정 데이터베이스 벤더가 제공하는 드라이버
  • JDBC 드라이버는 데이터베이스와의 통신을 담당하며, JDBC API를 구현한다.
  • JDBC 드라이버는 각 데이터베이스 벤더의 고유한 프로토콜을 사용하여 데이터베이스와 통신한다.

Connection

  • 특정 데이터 원본 즉 데이터베이스와의 연결을 나타낸다.
  • 연결을 설정하고 해제하는 데 사용된다.
  • Statement instance 생성 시, Connection instance를 사용하여 createStatement() method를 호출한다.
  • SQL문 실행 전 우선 Connection instance가 있어야 한다.

Statement

  • Connection class의 createStatement() method를 호출하여 Statement instance를 생성한다.
  • 생성한 instance의 executeQuery() method를 호출하여 SQL문 수행한다. ( SQL문을 String에 담아 인자로 전달한다.)
try {
	String query = "SELECT ID, LAST_NAME FROM EMP";
    stmt = con.createStatement();
    rset = stmt.executeQuery(query);
} catch (SQLException) {
	e.printStackTrace();
} 

PreparedStatement

  • Connection class의 preparedStatement() method를 사용하여 instance를 생성한다.
  • QL 문을 실행하기 위한 준비된 문(statement)이다.
  • 실행 전에 SQL 문에 파라미터 값을 설정할 수 있다.
  • SQL 인젝션 공격을 방지하기 위해 사용되기도 한다.
  • SQL문을 위치홀더(placeholder) '?'로 표현하는 String으로 정의한다.
  • PreparedStatement는 위치홀더 개념에 해당되는 인수가 많아 특저 값만 바꾸어 여러번 실행하는 상황에 유용하다.
  • Statement는 SQL문을 매번 컴파일 하지만 PreparedStatement는 한번만 컴파일 하므로 실행 속도가 빠르다.
try {
	String query = "INSERT INTO MEMBER VALUES(?, ?)";
    pstmt = con.preparedStatment(query);
    pstmt.getString(1, id);
    pstmt.getString(2, password);
} catch {
	e.printStackTrace();
}    

ResultSet

  • SELECT문 수행 성공 시 ResultSet을 반환한다.
  • SQL문에 의해 생성된 결과 테이블을 담고 있다.
  • 커서(cursor)로 특정 행에 대한 참조 조작을 할 수 있다.
  • 결과 집합은 테이블의 행과 열의 형태로 데이터를 저장하고, 이를 순회하면서 데이터에 접근할 수 있다.
/* next() : ResultSet의 커서를 하나 내리면서 해당 컬럼을 가르키고,
값이 존재하면 true 더이상 존재하지 않으면 false를 반환한다. */

while (rset.next()) {
	System.out.println(rset.getString("ID"));
}

JDBC 사용하는 일반적인 절차

  1. DriverManager에 해당하는 DBMS Driver를 등록한다.

    • 반드시 ClassNotFountException 처리를 해야 한다.
    • MySql 설정
    Class.forName("com.mysql.cj.jdbc.Driver");
  2. Driver로부터 Connection instance를 획득한다. (=DBMS 연결)

    • 반드시 SQLException 처리를 해야 한다.
    public static Connection getConnection(String url, String user, String password) throws SQLException {
    	Connection con = Drivermanager.getConnection("Jdbc:mysql://localhost/employee", "user", "password");
    }     
  3. 해당 Driver로부터 Connection instance 획득한다. (=Statement 생성)

    Statement stmt = con.createStatement();
  4. Statement에서 제공하는 method를 사용하여 SQL문을 실행한다. (= SQL 전송 및 결과 반환)

    • SELECT문 수행 예시
    Strinig query = "SELECT ID, LAST_NAME FROM EMP;
    ResultSet rset = stmt.executeQuery(query);
    
    while(rset.next()) {
    	System.out.println(rset.getString("ID") + "\t" + rset.getString(2));
    }
    • UPDATE 문 수행
    String query ="UPDATE EMP SET LAST_NAME = 'KIM'" + WHERE ID = '1000'";
    int result = stmt.executeUpdate(query);
  5. Connection close 및 객체를 반환한다.

finally {
	try {
		if(con != null && con.isClosed()) {
    		con.close();
       	}
	} catch (SQLException e) {
    	throw new RuntimeException(e);
	}    
}         

전체적으로 보기

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Application {
    public static void main(String[] args) {

        Connection con = null;

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            con = DriverManager.getConnection("jdbc:mysql://localhost/employee","user", "password");

            System.out.println(con);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
  • JDBCTemplete을 만들어
    Connection 객체에 DrvierManner 할당하는 과정
    Connection 객체 및 PreparedStatement 객체, ResultSet 객체를 close()하는 과정을 메소드로 사용할 수 있다.
profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글