5/22, 5/23 Gradle API

박세현·2024년 5월 22일
0

3차 프로젝트

목록 보기
2/14
post-thumbnail

JDBC API



1. Oracle JDBC 드라이버 설치

  • DriverManager 클래스 -> Connection
  • DataSource 인터페이스 -> Connection : 커넥션 풀

오라클 : ojdbc11.jar
ㄴ 11버전에서 JAR파일 제공?




2. 연동 과정

1) java.sql.* 패키지 임포트



2) JDBC 드라이버 로딩

  • Class.forName(패키지명을 포함한 전체 클래스명)
    ex) Class.forName("oracle.jdbc.driver.OracleDriver");

예시)



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

  • DB와 자바코드 연결

  • DriverManager
    • static Connection getConnection(String url, String user, String password);
    • url :

  • DataSource 인터페이스 : 커넥션 풀을 제공하는 라이브러리가 구현제가 있다
    (Tomcat JDBC, HokariCP)
    • Connection getConnection(...)


예시)



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

  • Statement
    • 정적 SQL 실행
    • Connection
  • PreparedStatement
  • CallableStatement

예시)


ㄴ 프로시저 생성

ㄴ 프로시저 호출



5) 쿼리 실행



6) 쿼리 실행 결과 값(int, ResultSet) 사용



7) 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement, Connection) 종료




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

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





데이터베이스 쿼리 실행

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

Connection
	Statement createStatement();

예시)

ㄴ sql문 실행 가능(DML)



1) ResultSet executeQuery(String sql)

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

예시)

package exam01;

import org.junit.jupiter.api.Test;

import java.sql.*;

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

        // String url = "jdbc:oracle:thin:@localhost:1521:EE"
        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "STUDY"; // SCOTT
        String password = "oracle";  // tiger

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement()) {

            String sql = "INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM, MOBILE) VALUES (SEQ_MEMBER.NEXTVAL, 'USER02', '123456', '사용자02', '01000000000')";

            int cnt = stmt.executeUpdate(sql);
            System.out.println(cnt);

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

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

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

            String sql = "SELECT * FROM MEMBER";
            ResultSet resultSet = stmt.executeQuery(sql);

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



2) int executeUpdate(String sql)

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

예시)

ㄴ 반환값 1 : 1개 레코드가 반영되었다




3) close()




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

Connection
	PreparedStatement prepareStatement(String sql);
    	값이 할당될 부분은 SQL?로 기입
  • 동적인 쿼리에 사용
  • 하나의 객체로 여러 번의 쿼리를 실행할 수 있으며, 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 매개변수가 많아서 쿼리문을 정리해야 할 때 유용
  • SQL 주입을 방지
  • 검색 혹은 외부에서 데이터가 유입되는 부분은 해킹의 위험이 항상 있다
  • 검색 혹은 외부에서 데이터가 유입되는 부분은 Statement 보다 PreparedStatement 을 쓰는게 보안을 더 높인다
    -> 직접적으로 변수에 값 대입하는 것 방지?
  • set자료형(int ?의 위치 번호, 값);
  • ResultSet executeQuery(); : SELECT
  • int executeUpdate(); : INSERT, UPDATE, DELETE

참고) Interface PreparedStatement
https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/PreparedStatement.html


예시) set자료형(int ?의 위치 번호, 값);




3. CallableStatement 객체로 데이터 접근하기

1) 프로시저 실행시 사용




4. 쿼리문 실행 결과 값 가져오기

1) ResultSet 객체의 메서드

  • boolean next() : 다음행으로 이동, 다음 행이 있으면 true, 없으면 false

  • 자료형 get자료형(int 칼럼 순서번호);
  • 자료형 get자료형(String 칼럼명);

  • String setString(...) : 문자형 데이터(CHAR, VARCHAR2, CLOB...)
  • int getInt(...), long getLong(...) : 정수형 데이터
  • float getFloat(...), double getDouble(...) : 실수형 데이터

ㄴ 커서이동하면서 가져오기

ㄴ 1번째꺼 : 순서대로 가져오기
ㄴ 2번째꺼 : 필드명으로 가져오기


  • java.sql.Time :시간 - getTime(...)
  • java.sql.Date : 날짜 - getDate(...)
  • java.sql.Timestamp : 날짜 + 시간 - getTimestamp(...)



예시) 자료형 get자료형(int 칼럼 순서번호);



예시) 자료형 get자료형(String 칼럼명); : 컬럼명으로 가져오기

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

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

            String sql = "SELECT * FROM MEMBER";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()) {
                long userNo = rs.getLong("User_NO");
                String userId = rs.getString("USER_ID");
                String userPw = rs.getString("USER_PW");
                String userNm = rs.getString("USER_NM");
                String mobile = rs.getString("MOBILE");
                LocalDateTime regDt = rs.getTimestamp("REG_DT").toLocalDateTime();

                System.out.printf("USER_NO:%d, USER_ID:%s%n, USER_PW%s, USER_NM%s, MOBILE%s, REG_DT%s%n", userNo, userId, userPw, userNm, mobile, regDt);
            }

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




5. 기본키 조회하기

ㄴ 반환값 쳌

ㄴ 프리페어스테이트먼트의 두번째 매개변수 가리킴 = 기본키로 추출할 부분 정의





커넥션 풀

1. Tomcat JDBC

ㄴ ds.setTestWhileIdle(true); // 연결 객체가 유휴 상태일때 연결상태 체크
ㄴ 디비는 작동을 오래 안하고 있으면 작업의 효율성을 위해 객체 참조 끊어버림
ㄴ 그거 연결 끊겼나 확인할라고 쓴 코드
ㄴ 연결 끊겼으면 새로 객체 생성




2. HikariCP

profile
귤귤

0개의 댓글

관련 채용 정보