✔ JDBC
1. JDBC 기초
- JDBC(Java DataBase Connectivity)
- 자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이루어진 API. ANSI SQL(1999) 지원. (표준)
- SQL 문을 실행할 수 있는 함수 호출 인터페이스
◾ JDBC 특징
- DBMS 종류에 독립적인 자바 프로그래밍 가능.
- 데이터베이스가 달라지더라도 동일한 API 사용 가능(드라이버 및 URL 수정만 하면 가능.)
- 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS에 독립적인 특성을 가짐.
◾ JDBC 기능
- 데이터 베이스 연결 설정.
- SQL 문장 DBMS에 전송.
- SQL 문장 전송 후 결과 응답 확인 가능.
◾ JDBC Interface
- Database를 만드는 업체에게 제공되는 인터페이스
- 업체에게 제공되는 인터페이스를 각각의 DBMS업체들이 구현한 것 : 드라이버.
- 프로그래머에게 제공되는 인터페이스
- SQL 패키지가 제공하고 있는 라이브러리로 이를 활용해 DB 프로그램 작성 가능.
◾ JDBC 관련 클래스
- JDBC API : java.sql package
DriverManager
- JDBC API에서 제공되는 구상(Concrete) 클래스.
- 구상 클래스 : new 키워드로 생성할 수 있는 클래스
- JDBC Driver 인터페이스를 구현한 객체 관리.
- JDBC URL을 이용해 메모리에 로드 된 Driver 검색 -> Connection 연결.
Driver(interface)
- 드라이버에 대한 정보.
- 모든 드라이버가 반드시 구현해야 하는 인터페이스
- 드라이버의 버전이나 연결에 대한 정보 메서드.
Connection(interface)
- 데이터베이스에 대한 하나의 세션 표현.
- 세션 : 하나의 클라이언트가 서버에 요청을 하기 위해 연결을 맺은 상태.
- DriverManager 클래스의 getConnection()메서드를 이용해 획득.
- 기본적으로 setAutoCommit(true)로 설정.
- 직접 설정하기 위해서 setAutoCommit(false)로 설정.
Statement(interface)
- SQL 문장을 실행하고 결과 반환을 위해 사용.
- excute(String sql) : DML, Query(select), DDL 등 구분 없이 수행.
- 결과가 ResultSet이면 true, DML이거나 특별한 결과가 없다면 false.
- excuteQuery(String sql) : SELECT 쿼리 수행시 사용.
- excuteUpdate(String sql) : 주로 DML(INSERT, UPDATE, DELETE) 쿼리 수행시 사용.
- SQL Injection에 취약하므로 실무에서 사용 X :
PreparedStatement
사용
- Statement가 주어진 SQL을 그대로 전달하 것을 이용한 공격.
- 예시) 로그인 쿼리문에 임의의 SQL을 삽입하는 경우 등.
PreparedStatement(interface)
- 동일한 SQL 문장이 여러 번 반복적으로 수행될 때 사용하는 객체.
- 대용량의 문자나 바이너리 타입의 데이터(이미지, 사운드 등) 저장 가능.
- SQL 문장이 미리 컴파일 되어 PreparedStatement 객체에 저장.
- clearParameters()를 통해 Statement에 남겨진 값 초기화.
- excuteQuery(String sql) : SELECT 쿼리 수행시 사용.
- excuteUpdate(String sql) : 주로 DML(INSERT, UPDATE, DELETE) 쿼리 수행시 사용.
ResultSet(interface)
- 쿼리에 대한 결과값 처리.
- 첫 번째 레코드보다 바로 이전을 가르킴.
- next() : ResultSet 객체의 커서 이동.
- get___(index or name) : 해당 커서의 데이터 획득.
◾ JDBC 주요 인터페이스
- DriverManager는 여러 Connection 관리
- Connection은 Statement를 통해 여러 질의 가능.
- 하나의 Statement는 하나의 ResultSet만 가능.
- Connection, Statement, ResultSet은 close해야하는 resource
2. JDBC Programming
◾ 개발 순서
- JDBC Driver Loading.
- DBMS 연결 : Connection 생성.
- SQL 실행 준비 : Statement/PreparedStatement 생성.
- SQL 실행.
- DML : INSERT, UPDATE, DELETE.
- DQL(SELECT) : 실행 결과 ResultSet 객체.
- DBMS 연결 끊기.
◾ JDBC 예시
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCPreparedStatementTest {
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("드라이버 로딩 완료...");
String url = "jdbc:mysql://127.0.0.1:3306/ssafydb?serverTimezone=Asia/Seoul&useUniCode=yes&characterEncoding=UTF-8";;
Connection conn = DriverManager.getConnection(url, "ssafy", "ssafy");
System.out.println(conn.getClass().getName());
System.out.println("Connection 완료...");
String sql = "SELECT employee_id, first_name, job_id, salary FROM employees WHERE employee_id = ?;";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, 100);
ResultSet result = stmt.executeQuery();
String sql = "SELECT employee_id, first_name, job_id, salary FROM employees WHERE employee_id = 100;";
Statement stmt = conn.createStatement();
ResultSet result = stmt.executeQuery(sql);
while(result.next()) {
StringBuilder sb = new StringBuilder();
sb.append(result.getInt(1)).append("\t")
.append(result.getString(2)).append("\t")
.append(result.getString(3)).append("\t")
.append(result.getString(4));
System.out.println(sb);
}
result.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}