Java JDBC

김정훈·2024년 5월 22일

Java

목록 보기
39/48

JDBC

JDBC(Java DataBase Connectivity) API
API(Application Programming Interface)

  • 자바 데이터베이스 연결 기술 명세서 - 인터페이스로 구성
  • 구현체는 각 DB업체가 구성(데이터베이스 드라이버)
  • java.sql 패키지 - JDBC API

1. Oracle JDBC 드라이버 설치

ojdbc11.jar
DriverManager 클래스 👉 Connection
DataSource 인터페이스 👉 Connection : 커넥션 풀

2. 연동 과정

1) java.sql.* 패키지 임포트
2) JDBC 드라이버 로딩

  • Class.forName(...) 👉 odjdc11.jar
    oracle.jdbc.driver.OracleDriver
public class Ex01 {
    void test1(){ //동적로딩
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}

3) 데이터베이스 접속을 위한 Connection객체 생성

  • DriverManage : 접속을 할때 마다 Connection 객체를 생성 👉 효울성❌, 성능❌
    • Connection getConnection(...)(String url, String user, String password);
  • DataSource 인터페이스 : 커넥션 풀을 제공하는 라이브러리 구현체 존재 (Tomcat JDBC, HikariCP)
    • Conncection getConnection(...)
public class Ex01 {
    void test1(){
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "STUDY";
        String password = "oracle";
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

4) 쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성

public class Ex01 {
    void test1(){
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "STUDY";
        String password = "oracle";
        try(Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement()){

        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}

5) 쿼리 실행
1. Statement 객체로 데이터 접근
Connection
Statment createStatement()
1) ResultSet executeQuer(String sql)

  • 조회를 하는 쿼리 수행 / SELECT
  • ResultSet : 조회한 레코드의 조회 시작 주소 값

2) int executeUpdate(String sql)

  • 변경을 가하는 쿼리 수행 / INSERT, UPDATE, DELETE
  • 반환값 : 반영된 레코드 갯수

6) 쿼리 실행 결과 값(int, ResultSet) 사용
7) 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement, Connection) 종료

3. JDBC 드라이버 로딩 및 DBMS 접속

1) JDBC 드라이버 로딩하기
2) Connection 객체 생성하기
3) 데이터베이스 연결 닫기

데이터베이스 쿼리 실행

1. Statement 객체로 데이터 접근하기

1) ResultSet executeQuery(String sql)
2) int executeUpdate(String sql)
3) close()

2. PreparedStatement 객체로 데이터 접근하기

1) 동적인 쿼리에 사용
2) 하나의 객체로 여러 번의 쿼리를 실행할 수 있으며, 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 매개변수가 많아서 쿼리문을 정리해야 할 때 유용

  1. CallableStatement 객체로 데이터 접근하기
    1) 프로시저 실행시 사용

  2. 쿼리문 실행 결과 값 가져오기
    1) ResultSet 객체의 메서드

커넥션 풀

Tomcat JDBC

의존성 : tomcat-jdbc

public class Ex03 {

    /* DB 연결 URL, 계정 */
    private String url = "jdbc:oracle:thin:@localhost:1521:XE";
    private String user = "STUDY"; // SCOTT
    private String password = "oracle"; // tiger

    @BeforeAll
    static void init() {
        try {
            // 오라클 드라이버 동적 로드
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    @Test
    void test1() {
        String sql = "CALL REGISTER_MEMBER(?, ?, ?, ?)";
        try (Connection conn = DriverManager.getConnection(url, user, password);
             CallableStatement cstmt = conn.prepareCall(sql)) {
            cstmt.setString(1, "USER99");
            cstmt.setString(2, "123456");
            cstmt.setString(3, "사용자99");
            cstmt.setString(4, "01000000000");

            int cnt = cstmt.executeUpdate();
            System.out.println(cnt);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Test
    void test2(){
        DataSource ds = new DataSource();
//        DB 연결 설정 S
        ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
        ds.setUsername("STUDY");
        ds.setPassword("oracle");
//        DB 연결 설정 E
//        커넥션 풀 설정 S
        ds.setInitialSize(2); //로드 초기에 생성할 연결 객체 수  - 기본값 10
        ds.setMaxActive(10); //최대 생성할 연결 객체 수 - 기본값 100
        ds.setTestWhileIdle(true); //연결 객체가 유휴 상태일 때 연결 상태 체크
        ds.setTimeBetweenEvictionRunsMillis(5 * 1000); //5초에 한번씩 연결 상태 체크
        ds.setMinEvictableIdleTimeMillis(30 * 1000); //유휴 상태 객체 30초 이후에 새로 생성
//        커넥션 풀 설정 E
//        Connection 객체 생성 S
        try(Connection conn = ds.getConnection()){
            System.out.println(conn);
        }catch(SQLException e){
            e.printStackTrace();
        }
//        Connection 객체 생성 E
//
    }
}

Hikari

package exam01;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import javax.xml.crypto.Data;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Ex03 {

    /* DB 연결 URL, 계정 */
    private String url = "jdbc:oracle:thin:@localhost:1521:XE";
    private String user = "STUDY"; // SCOTT
    private String password = "oracle"; // tiger

    @BeforeAll
    static void init() {
        try {
            // 오라클 드라이버 동적 로드
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    @Test
    void test3(){
//        연결 설정 S
        HikariConfig config = new  HikariConfig();
        config.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
        config.setUsername("STUDY");
        config.setPassword("oracle");
//        연결 성정 E
//        커넥션 풀 성정 S
        config.setMinimumIdle(2);
        config.setMaximumPoolSize(10);
//        커넥션 풀 성정 E
//        DataSource 객체 생성
        HikariDataSource ds = new HikariDataSource(config);

//        Connection 객체 생성
        try(Connection conn = ds.getConnection()){
            System.out.println(conn);
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}
profile
안녕하세요!

0개의 댓글