본문 바로가기
  • 개발 삽질 블로그
프로그래밍/Java Programming

JDBC Programming

by 갹둥 2022. 12. 10.

학교에서 데이터베이스 프로그래밍이라는 과목에서 JDBC 프로그래밍을 배웠습니다

시험과 팀플 대비 정리 시작~!

 

📌JDBC(Java Database Connectivity)

  • Java application에서 DBMS를 연동하기 위한 표준 API
    -> DBMS 종류에 상관 없이 데이터베이스 접속 및 질의 실행 가능
  • 오라클 홈페이지나 Maven repository에서 다운로드 가능

*pom.xml에 dependency 추가하여 사용하였습니다

 

 

JDBC API는 두 개의 package로 구성됩니다

  • java.sql : Data source에 저장된 데이터를 접근하고 처리하기 위한 API 제공

ex) DriverManager, Connection, Statement, PreparedStatement, ResultSet .etc

 

  • javax.sql: 서버에 존재하는 data source를 접근하고 이용하기 위한 API 제공

 

 

🪄JDBC 사용절차

1) JDBC package import

2) JDBC Driver 로딩 및 등록(Driver가 준비되어 있어야 함)

3) DBMS와의 Connection 획득

4) Statement나 PreparedStatement 객체 등으로 SQL문 수행 및 응답 사용

5) 자원 반납

 

 

1)JDBC package import

Java 프로그램 내에서 import하기

 

2) JDBC Driver 로딩 및 등록

Class.forName()으로 드라이버 클래스 타입 객체 메모리에 로딩

ex) ORACLE DB 사용

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

 

3)DBMS와의 Connection 획득

방법1. DriverManager.getConnection() 이용하는 방식

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

*url: jdbc:[DBMS Server 주소:port 번호]:[DB식별자]

*getConnection()은 정적 메소드임

 

방법2. DataSource 인터페이스의 getConnection()을 이용하는 방식

DataSource 객체 획득 후

dataSource.getConnection();

*방법1의 대안으로 Connection을 얻기 위한 더 좋은 방법

*JNDI 서비스를 통해 DataSource 객체 제공

*Database Connection Pooling(DBCP) 기능 지원  //추후 설명

 

4) Statement나 PreparedStatement 객체 등으로 SQL문 수행 및 응답 사용

Statement stmt = connection.createStatement(); //Statement 객체 생성
ResultSet result  = stmt.executeQuery(sql) //Statement 객체를 이용하여 sql문 실행

while(result.next){

    String s = result.getString("name"); //column명 또는 인덱스 번호

...

}

*Statement: 정적인 SQL 문을 실행하고 그 결과를 반환하기 위해 사용되는 객체

*PreparedStatement, CallableStatement도 있음(뒤에서 설명)

*executeQuery () 실행 응답으로는 resultSet이 반환됨

 

5) 자원 반납

finally {
    if(rs != null) try { rs.close();} catch(SQLException ex) {}
    if(stmt != null) try { stmt.close();} catch(SQLException ex) {}
    if(conn != null) try { conn.close();} catch(SQLException ex) {}
}

*작업이 끝난 후 자원 반납을 해줘야 함

*서버에 부하가 증가하기 때문

 

 

JDBC에서 SQL문 사용 및 응답

sql문을 실행할 때는 아래의 객체를 이용함

 

-Statement

일반적인 SQL문 사용 시 이용

사용할 때 마다 SQL문을 새로 컴파일을 하고 SQL문을 실행하기 때문에 DBMS의 부하가 증가함

동일한 형태의 SQL문을 반복적으로 사용할 때 비효율적임

SQL문에 자바 문자열 데이터를 사용할 때 반드시 따옴표를 붙혀야 하는 가독성 문제도 있음

Statement stmt = connection.createStatement(); //Statement 객체 생성
stmt.excuetQuery("select * from tableA where id = 1");-> 쿼리 컴파일 후 실행

stmt.excuetQuery("select * from tableA where id = 2 "); -> 이런식으로 구조가 같아도 쿼리를 다시 컴파일한 후 실행하기 때문에 비효율적임.

 

-PreparedStatement

사전에 컴파일한 SQL문을 실행, 반복적인 컴파일을 피함 -> DBMS 부하 감소

실제 데이터 값은 질의를 실행할 때 지정, 파라미터 이용

String query = "select * from tableA where id = ? "; //공통 부분을 미리 준비, 바뀌는 부분만 파라미터로 지정
pstmt = connection.prepareStatement(query); //미리 컴파일
pstmt.setInt(1, 1); //파라미터 세팅, 질의문의 ? 자리에 들어갈 값 지정
pstmt.executeQuery(); //쿼리 실행, 파라미터 없음 주의

*pstmt의 excuteQuery()는 매개변수가 없음. Statement를 상속받았기 때문에 부모 메소드 실행함, 컴파일러가 에러를 못 잡음*

 

set method들

-setXXX(인덱스 번호, XXX 타입 값)

-? 순서에 따라 1부터 시작하는 인덱스를 가짐 

*테이블 명은 매개변수로 대치할 수 없음

-? 개수와 set method 호출 개수가 일치하야 함, 일치하지 않는 경우 SQLException 발생

메소드 명 설명
setObject(int index, Object val) Object형 값을 지정
setString(int index, String val) String 타입의 값을 지정
setInt(int index, int val) int 타입의 값을 지정
setLong(int index, long val) long 타입의 값을 지정
setDouble(int index, double val) double 타입의 값을 지정
setFloat(int index, float val) float 타입의 값을 지정
setTimestamp(int index, Timestamp val) java.sql.Timestamp 타입의 값을 지정
setDate(int index, Date val) java.sql.Date 타입의 값을 지정
setCharacterStream(int index, Reader reader, int length) length 길이의 Stream 값 지정

ex)

pstmt.setString(1, "이름");

pstmt.setInt(2, 22);      

 

-CallableStatement

SQL Stored Procedure 및 함수 호출 시 이용

ex)

String sp = "{  call  my_proc(?, ?) }";  //프로시저 호출문 작성

CallableStatement cstmt = connection.prepareCall(sp); //CallableStatement 객체 생성

cstmt.setInt(1, 10000); //In mode 파라미터 세팅

cstmt.registerOutParameter(2, java.sql.Types.VARCHAR) //Out mode 파라미터 세팅

cstmt.excute();  //CallableStatement 실행

String output = cstmt.getString(2); //결과 받기

 

*직접 쿼리를 작성하는 것이 아니라 Stored Procedure/Function을 통한 간접 호출

cf) Stored Procedure(저장 프로시저): 복잡한 SQL문장들을 SQL 서버에서 하나의 함수처럼 한 단위로 저장해서 편리하게 호출할 수 있게 만든 것

-> 코드 복잡도가 감소함, 코드를 재사용 가능, 성능 및 보안성 향상

 

 

Metadata 사용

DatabaseMetaData Interface: 데이터베이스 메타정보 제공

ResultSetMetaData Interface: ResultSet 객체에 포함된 컬럼들에 대한 메타정보 제공

'프로그래밍 > Java Programming' 카테고리의 다른 글

Java Secure Coding Rule  (0) 2023.04.20