Programming Language/Javascript, ...

[JDBC] 개요 - 사용 객체, 처리 절차

Ma_Sand 2022. 4. 2. 22:24
반응형

JDBC(Java Database Connectivity)

   : Java에서 데이터베이스에 접근할 수 있게 해주는 Programming API이다.

  - java.sql 패키지를 사용한다.

 

 

 

 

JDBC 사용 객체

 (1) DriverManager

   : 데이터 원본에 JDBC Driver를 통하여 Connection을 만드는 객체이다.

   ① Class.forName()을 통해 생성되며 반드시 예외 처리를 해야 한다.

   ② DriverManager 클래스의 getConnection()을 사용하여 객체를 생성한다.

       이때, Connection 객체 생성 시에 직접 객체 생성이 불가능하다.

 

 

 

 (2) Connection

   : 데이터베이스의 연결 정보를 담고 있는 객체이다. (IP주소, PORT번호, 계정명, 비밀번호)

   ① Statement 객체를 생성할 때 Connection 객체를 사용하여 createStatement()를 호출하여 생성한다.

   ② SQL문을 실행시키기 전에 Connection 객체가 있어야 한다.

 

 

 

 (3) (Prepared)Statement

   : 해당 데이터베이스에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체이다.

 

  - Statement

   ① Connection 클래스의 createStatement()를 호출하여 얻어진다.

   ② 생성된 Statement 객체로 질의 문장을 String 객체에 담아 인자로 전달해서 executeQuery()를 호출하여

        SQL 질의를 수행한다.

 

  - PreparedStatement

   ① Connection 객체의 preparedStatement()를 사용하여 객체를 생성한다.

   ② 각 인수에 대해 위치홀더(?)를 사용해서 SQL문을 정의할 수 있게 한다.

   ③ Statement와 다른 점: SQL문이 미리 컴파일되고 실행할 동안 인수값을 위한 공간을 확보한다.

 

 

 

 (4) ResultSet

   : 실행한 SQL문이 SELECT문일 경우에 조회된 결과들이 담겨 있는 객체이다.

 

 

 

 

JDBC 처리 절차(Oracle SQL 기준)

 (1) JDBC Driver 등록하기

   : DriverManager에 해당 DBMS(Database Manager System) Driver를 등록한다.

     이때, 반드시 ClassNotFoundException 처리를 해야 한다.

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

 

 

 

 (2) Connection 생성하기

   : 접속할 데이터베이스에 정보를 입력하여 데이터베이스에 접속하면서 생성한다.

     이때, 반드시 SQLException 처리를 해야 한다.

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");

 

 

 

 (3) Statement 생성하기

   : Connection 객체를 사용하여 생성한다. 이때, 반드시 SQLException 처리를 해야 한다.

Statement stmt = conn.createStatement();

 

 

 

 (4) SQL문을 전달하면서 실행하고 결과 받기

   : Statement 객체를 사용하여 SQL문을 실행한다. SELECT문일 경우엔 executeQuery()를 사용해서 실행하고,

     DML문일 경우엔 executeUpdate()를 사용해서 실행한다.

   ① SELECT문일 경우

      : ResultSet 객체로 받아서 해당 객체에 담긴 데이터들을 하나씩 뽑아 VO 객체에 담는다.

        ArrayList로 묶어서 관리한다.

   ② DML문일 경우

      : int형 변수로 처리된 행들을 받아서 처리한다.

// SELECE문
String sql = "SELECT * FROM STUDENT";
ResultSet rset = stmt.executeQuery();


// DML문(UPDATE)
String sql2 = "UPDATE STUDENT SET ST_GRADE = 3 WHERE ST_NAME = '서동요'";
int result = stmt.executeUpdate();

   ③ SQL문을 트랜잭션 처리를 하는데, if문으로 성공이면 'COMMIT;'을, 실패면 'ROLLBACK;'을 한다.

 

 

 

 (5) 사용 완료한 객체 반환하기

   : 생성한 역순으로 객체를 반환한다.

rset.close();  // ResultSet 객체를 사용한 경우에 반환 처리한다.
stmt.close();
conn.close();

 

 

 

 - SQL문

CREATE TABLE STUDENT(
    ST_NO NUMBER,
    ST_NAME VARCHAR2(20),
    ST_DATE DATE
);

 

 

 - SELECT문

package jdbc;

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

public class Select {
    public static void main(String[] args) {
        Connection conn = null;  // DB에 연결 정보를 보관할 객체 Connection
        Statement stmt = null;  // SQL문을 전달해서 실행한 후 결과를 담을 객체 Statement
        ResultSet rset = null;  // SELECT문은 ResultSet으로 담는다.
        
        String sql = "SELECT * FROM STUDENT";
        
        try {
            // JDBC Driver 등록
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
            // Connection 객체 생성(DB에 연결(URL, 계정명, 비밀번호))
            // localhost(ip주소), 1521(port번호), xe(버전)
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
            
            // Statement 객체 생성
            stmt = conn.createStatement();
            
            // SQL문을 전달하면서 실행한 후 ResultSet결과 받기
            // SELECT문은 executeQuery()
            rset = stmt.executeQuery(sql);
            
            // 참고하고 있는 rset으로부터 어떤 컬럼에 해당하는 값을 어떤 타입에 담을 것인지 제시한다.
            // next(): 다음 위치로 커서 이동. 다음 위치가 있으면 true, 없으면 false
            while(rset.next()) {
                int stNo = rset.getInt("ST_NO");  // DB의 컬럼명 제시
                String stName = rset.getString("ST_NAME");
                Date sDate = rset.getDate("ST_DATE");
                
                System.out.println(stNo + ", " + stName + ", " + sDate);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {  // 사용한 객체 반환하기(생성한 역순으로 반환)
            try {
                rset.close();
                stmt.close();
                conn.close();
            }
        }
        if(result > 0) {  // SQL문 삽입에 성공한 경우
            System.out.println("삽입 성공");
        } else {  // SQL문 삽입에 실패한 경우
            System.out.println("삽입 실패");
        }
    }
}

 

 

 - DML문

package jdbc;

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

public class Dml {
    public static void main(String[] args) {
        Connection conn = null;  // DB에 연결 정보를 보관할 객체 Connection
        Statement stmt = null;  // SQL문을 전달해서 실행한 후 결과를 담을 객체 Statement
        int result = 0;  // DML문은 int형 변수로 받아서 처리
        
        // 번호, 이름, 등록일
        String sql = "INSERT INTO STUDENT VALUES (15, '이순신', SYSDATE)";
        
        try {
            // JDBC Driver 등록
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
            // Connection 객체 생성(DB에 연결(URL, 계정명, 비밀번호))
            // localhost(ip주소), 1521(port번호), xe(버전)
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
            
            // Statement 객체 생성
            stmt = conn.createStatement();
            
            // SQL문을 전달하면서 실행한 후 결과 받기
            result = stmt.executeUpdate(sql);
            
            // 트랜잭션 처리
            if(result > 0) {  // 성공한 경우(처리된 행의 개수가 1 이상일 경우)
                conn.commit();
            } else {  // 실패한 경우
                conn.rollback();
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {  // 사용한 객체 반환하기(생성한 역순으로 반환)
            try {
                stmt.close();
                conn.close();
            }
        }
        if(result > 0) {  // SQL문 삽입에 성공한 경우
            System.out.println("삽입 성공");
        } else {  // SQL문 삽입에 실패한 경우
            System.out.println("삽입 실패");
        }
    }
}
반응형