JDBC ( Java DataBase Connectivity )
* 자바에서 데이터베이스와 관련된 작업을 할 때 사용하는 API
1. JDBC 구조
* Java 어플리케이션에서 데이터베이스를 사용할 때에는 데이터베이스 종류와 상관ㅇ벗이 JDBC API를 이용해서 데이터베이스에 접근한다.
* 각종 DBMS들은 JDBC 드라이버를 제공하고있다. JDBC API는 이 드라이버를 거쳐 데이터베이스와 통신을 한다.
* 각 DBMS에 알맞은 JDBC 드라이버만 있다면 어떤 데이터베이스라도 사용할 수 있다.
2. JDBC 드라이버
* JDBC 드라이버는 클래스 형태로 존재하고, 일반적으로 Jar 파일로 제공된다.
* MySQL을 예를 들면, Myslq을 설치한 폴더의 Connector 폴더를 살펴보면 mysql-connector-java-버전-bin.jar 파일을 찾을 수 있다.
* connector jar 파일이 없다면, JDBC 드라이버 다운로드 링크
MySQL 링크 : https://dev.mysql.com/downloads/connector/j/
오라클 링크 : http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
MariaDB : https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/
* 웹 어플리케이션 폴더의 WebContent/WEB-INF/lib 폴더에 JDBC 드라이버를 복사하면 해당 드라이버를 사용할 수 있다.
3. JDBC 프로그래밍
* 실행 순서
1) JDBC 드라이버 로딩
Class.forName( " com.mysql.jdbc.Driver " );
MySQL : com.mysql.jdbc.Driver
오라클 : oracle.jdbc.driver.OracleDriver
MY SQL서버 : com.microsoft.sqlserver.jdbc.SQLServerDriver
MariaDB : org.mariadb.jdbc.Driver
2) 데이터베이스 커넥션 구함
conn = DriverManager.getConnection( jdbcDriver, dbUser, dbPass );
3) 쿼리 실행을 위한 Statement 객체 생성
stmt = conn.createStatement();
4) 쿼리 실행
rs = stmt.executeQuery(query);
5) 쿼리 실행 결과 사용 ( DB 쿼리 사용 )
6) Statement 종료
stmt.close();
7) 데이터베이스 커넥션 종료
conn.close();
3-1. JDBC URL
* 데이터베이스를 구분할 때 사용하는 URL과 비슷한 형식을 가진 것.
* 사용하는 JDBC 드라이버에 따라서 JDBC URL의 표현 방식이 차이가 난다.
* 일반적 사용
jdbc : [DBMS] : [데이터베이스 식별자]
1) MySQL
jdbc : mysql : //HOST[ : PORT] / DBNAME [?param = value & param2 = value2 & ...]
HOST : MySQL 서버 호스트 주소
DBNAME : DataBase 이름
PORT : MySQL 서버가 사용하는 포트 번호
[?param ...] : 추가 정보, ex) 한글 데이터를 올바르게 하기 위해서 아래를 추가한다.
?useUnicode=ture&characterEncoding=utf8
2) 오라클
jdbc : oracle : thin : @HOST : PORT : SID
3-2. 데이터베이스 커넥션
* JDBC를 사용하여 데이터베이스를 사용하기 위해 getConnection() 메소드를 사용해 DB와 연결된 Connection 객체를 리턴한다.
* 데이터베이스 커넥션 : java.sql.Connection 타입
* java.sql.DriverManager 클래스가 제공하는 getConnection() 메소드를 사용하여 커넥션을 구한다.
▷ DriverManager.getConnection( String jdbcURL )
▷ DriverManager.getConnection( String jdbcURL, String dbuser, String dbPassword )
* catch 블록을 사용해 익셉션 처리가 필요하다.
3-3. Statement 쿼리 실행
* Connection 객체 리턴 후 Connection 객체로부터 Statement를 생성하고 쿼리를 실행할 수 있다.
* Connection 객체의 createStatement() 메소드를 사용해 Statement를 생성한다.
▷ ResultSet executeQuery( String query ) : SELECT 쿼리를 실행한다.
▷ int executeUpdate( String query ) : INSERT, DELETE, UPDATE 쿼리를 실행한다. 쿼리 결과로 변경된 레코드 개수 리턴
* ResultSet에서 값 읽어오기
▷ executeQuery() 메소드는 SELECT 쿼리 실행 후 결과값을 java.sql.ResultSet 객체에 저장 해서 반환한다.
▷ ResultSet의 next() 메소드
: SELECT 결과의 존재 여부를 확인할 수 있다.
: SELECT 쿼리 결과를 행으로 저장하며 커서를 통해서 각 행의 데이터에 접근한다. ResultSet.next() 케소드는 커서의 다음 행이 존재하는 경우 true를 반환하고 커서를 그 행으로 이동시킨다. 이 ResultSet.next() 메소드를 계속해서 호출하면 위와 같이 순차적으로 다음 행으로 이동 후 마지막 행에 커서가 도착하면 ResultSet.next() 메소드는 false를 반환한다.
▷ ResultSet 클래스의 주요 읽기 메소드
메소드 |
리턴 타입 |
설명 |
getString(String name) getString(int index) |
String |
지정한 칼럼 값을 String으로 읽어온다. |
getChracterStream(String name) getCharacterStream(int index) |
java.io.Reader |
지정한 칼럼 값을 Stream 형태로 읽어온다. LONG, VARCHAR 타입을 읽어올때 사용. |
getInt(String name) getInt(int index) |
int |
지정한 칼럼 값을 int 타입으로 읽어온다 |
getLong(String name) getLong(int index) |
long |
지정한 칼럼 값을 long 타입으로 읽어온다. |
getDouble(String name) getDouble(int index) |
double |
지정한 칼럼 값을 double 타입으로 읽어온다. |
getFloat(String name) getFloat(int index) | float | 지정한 칼럼 값을 float 타입으로 읽어온다. |
getTimestamp(String name) getTimestamp(int index) | java.sql.Timestamp | 지정한 칼럼 값을 Timestamp 타입으로 읽어온다. SQL TIMESTAMP 타입을 읽어올 때 사용한다. |
getDate(String name) | java.sql.Date | 지정한 칼럼 값을 Date 타입으로 읽어온다. SQL DATE 타입을 읽어올 때 사용한다. |
getTime(String name) getTime(int index) | java.sql.Time | 지정한 칼럼 값을 Time 타입으로 읽어온다. SQL TIME 타입을 읽어올 때 사용한다. |
* ResultSet에서 LONG VARCHAR 타입 읽어오기
▷ SQL의 LONGVARCHAR 타입을 대량의 텍스트 데이터를 저장할 때 사용한다.
▷ getCharacterStream() 메소드를 사용한다.
rs = stmt.executeQuery(...);
String data = null; //스트림으로 읽어온 데이터 저장 변수
java.io.Reader reader = null; //LONG VARCHAR 데이터를 읽어올 스트림
try{
// 1. getCharacterStream()을 이용해 Reader를 구한다.
reader = rs.getCharacterStream("FILED");
if(reader != null){
// 3. 스트림에서 읽어온 데이터를 저장할 버퍼를 생성
StringBuilder buff = new StringBuilder();
char[] ch = new char[512];
int len = -1;
// 3. 스트림에서 데이터를 읽어와 버퍼에 저장
while( (len = reader.read(ch)) != -1){
buff.append(ch, 0, len)
}
// 4. 버퍼에 저장한 내용을 String으로 변환
data = buff.toString();
}
} catch(IOException e){
//5, IO 관련 처리 중 익셉션 발생 시 처리
} finally {
// 6. Reader를 종료
if(reader != null) try{ reader.close(); } catch(IOException e){}
}
// 7. 데이터 사용
'WEB > JSP Servlet' 카테고리의 다른 글
서블릿 : 초기화 (0) | 2016.11.22 |
---|---|
서블릿 : 기본 (0) | 2016.11.21 |
커스텀 태그 : 기초, 태그 파일 (0) | 2016.11.05 |
JDBC : 기초 (0) | 2016.11.05 |
표현언어(EL) 비활성화 방법 (0) | 2016.11.05 |