학교에서 데이터베이스 프로그래밍이라는 과목에서 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 |
---|