JDBC
API란?
- Application Platform Interface
JDBC(Java DataBase Connectivity)
JDBC란?
- 자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이루어진 API
- ANSI SQL을 지원
- SQL문을 실행할 수 있는 함수 호출 인터페이스
특징
- DBMS 종류에 독립적인 자바 프로그래밍 가능
- 데이터베이스가 달라지더라도 동일한 API를 사용하게 해줌
- 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS에 독립적인 특성을 가짐
기능
- 데이터베이스에 연결 설정 한다
- SQL 문장을 DBMS에 전송한다
- SQL 문장 전송 후 결과를 처리할 수 있게 해준다
JDBC Interface
- Database를 만드는 업체에게 제공되는 인터페이스
- 업체에게 제공되는 인터페이스를 각각 DBMS 업체들이 구현해 놓은 것
- 프로그래머에게 제공되는 인터페이스
- SQL 패키지가 제공하고 있는 라이브러리
- 프로그래머는 이 라이브러리를 기반으로 DB 프로그램을 작성
JDBC의 구조
- JDBC API (java.sql package)
- Driver (Interface)
- 드라이버에 대한 정보를 가지고 있음
- 모든 드라이버가 반드시 구현해야 하는 인터페이스
- 드라이버의 버전이나 연결에 대한 정보를 알아볼 수 있는 메소드를 가지고 있음
- Connection (Interface)
- 데이터베이스에 대한 하나의 세션을 표현
- 세션은 하나의 클라이언트가 서버에 요청을 하기 위해 연결을 맺은 상태를 의미
- DriverManager 클래스의 getConnection() 메소드를 이용하여 얻어 올 수 있음
- 디폴트로 setAutoCommit(true)로 설정됨
- 개발자가 원하는 경우에 commit을 해주고 싶거나 트랜잭션이 아주 중요한 부분에 있어서 RollBack 처리를 하고자 할 경우에는 setAutoCommit(false)로 설정
- 단, 이 경우에는 SQL문을 수행할 때 마다 명식적으로 commit()을 호출해야 함
- Statement (Interface)
- SQL 문장을 실행하고 그것에 대한 결과 값을 가져오기 위해 사용
- public boolean execute(String sql) throws SQLException
- 특별히 SQL문을 구분하지 않고 DML, QUERY, DDL 등을 수행할 수 있다
- 결과가 ResultSet이면 true, DML이거나 특별한 결과가 없으면 false를 리턴한다
- public ResultSet executeQuery(String sql) throws SQLException
- public int executeUpdate(String sql) throws SQLException
- 주로 DML(delete, update, insert) 등의 SQL을 수행할 때 사용
- PreparedStatement (Interface)
- 동일한 SQL 문장이 여러번 반복적으로 수행될 때 사용하는 객체
- 대용량의 문자나 바이너리 타입의 데이터를 저장하기 위해서도 사용될 수 있음
- SQL 문장이 미리 컴파일 되어 PreparedStatement 객체에 저장됨
- 여러 번 반복 수행 시 clearParameters() 메소드를 이용해 Statement에 남겨진 값을 초기화
- CallableStatement (Interface)
- 데이터베이스에 대하여 실제 SQL문을 실행하는 것이 아니라 Stored Procedure를 호출
- Stored Procedures란 연속되는 SQL문으로 데이터베이스에 저장해 두고 마치 함수의 호출처럼 사용
- 데이터베이스에 Stored Procedures 를 만들어 두고 자바에서 호출하여 사용할 수 있게 함
- 속도 향상을 기대할 수 있음
- 자바 코드에 SQL 문장이 들어가지 않으므로 자바 코드가 SQL에 독립적이 됨
- ResultSet (Interface)
- 쿼리에 대한 결과값 처리
- ResultSet 객체의 커서는 첫번째 레코드 바로 이전을 가리킴
- next()
- getXXX(Index or name) 메소드를 이용하여 데이터를 얻을 수 있음
JDBC Programming
- JDBC Driver Loading
- 데이터베이스와의 접속을 오픈하기 위해 애플리케이션의 JVM 안으로 특정 드라이버 클래스를 적재
- Class.forName(Driver ClassName);
- 각 DataBase 별 DriverName
- MySQL : com.mysql.cj.jdbc.Driver
- Oracle : oracle.jdbc.driver.OracleDriver
- MSSQL : com.microsoft.sqlserver.jdbc.SQLServerDriver
- DBMS와 연결 (Connection 생성)
- DriverManager 클래스를 이용하여 URL형태로 주어진 데이터베이스에 대한 접속을 요청
- Connection conn = DriverManager.getConnection(URL, dbid, dbpassword);
- SQL 실행 준비 (Statement, PreparedStatement 생성)
- String sql = “insert, update, delete, select, …”
- Statement 생성
- Statement stmt = conn.createStatement();
- PreparedStatement 생성
- PreparedStatement pstmt = conn.preparedStatement(sql);
- SQL 실행 (executeUpdate, executeQuery)
- Statement
- DML
- int cnt = stmt.executeUpdate(sql);
- SELECT
- ResultSet rs = stmt.executeQuery(sql);
- PreparedStatement
- SQL문의 치환변수값 설정
- pstmt.setXXX(index, value);
- DML
- int cnt = pstmt.executeUpdate();
- Select
- Result rs = pstmt.executeQuery();
- ResultSet
- ResultSet을 얻어온 후 rs.next() 를 실행해야 함
- select의 결과가 반드시 하나 나오는 경우
- select의 결과가 하나 또는 못 얻어올 수 있는 경우
- select의 결과가 여러개가 나올 수 있는 경우
- 값 얻기
- String str = rs.getString(index or name);
- int cnt = rs.getInt(index or name);
- …
- DBMS 연결 끊기
- 모든 작업이 끝난 경우에는 ResultSet, Statement(PreparedStatement), Connection 객체의 close() 메소드를 이용하여 작업을 종료한다. (연결한 순의 역순으로 종료)
- Connection은 상당한 Overhead를 가져온다. 따라서 최적화된 상태를 유지하기 위해서는 반드시 Connection을 닫아주어야 한다.