2011년 6월 9일 목요일

JDBC 1.0 사용법

1. JDBC 1.0
아주 기초적인 내용이지만 JDBC에 관하여 1.0 ~ 3.0까지 다룬다는 의미에서 정리 했습니다. JDBC 1.0 API 는 자바 개발 툴 JDK 1.1 이후 에서 지원이 됩니다.

환경설정
먼저, JDBC 1.0 환경을 갖추려면 다음 3가지 단계가 필요합니다.
A. Install JDK and JDBC on your machine.
JDK 1.1 을 인스톨 하면 JDBC 도 함께 자동으로 인스톨이 됩니다. JDBC 1.0 API 는 JDK 1.1 과 JDK 1.2 모두에서 지원이 되나 JDBC 2.0 API 는 JDK 1.2에서 만 지원이 됩니다.

B. Install a driver on your machine.
일반적으로 JDBC-ODBC Bridge Driver 는 JDK 인스톨 시에 자동으로 인스톨 되며 별도의 설정이 필요 없으며 필요할 경우 해당 데이타 베이스에 맞는 driver 를 설치 하면 됩니다.

C. Install your DBMS if needed.
원하는 데이타 베이스를 설치 합니다.

DB 연결하기
A. Loading Driver
JDBC-ODBC Bridge driver 를 사용할 경우
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
만약 사용하는 driver 의 class name 이 jdbc.DriverABC 인 경우
Class.forName(" jdbc.DriverABC");
로 설정을 해 주면 됩니다. 일단 driver 가 load 되면 데이타 베이스와 연결이 가능해 집니다.

B. Making the connection
Connection con = DriverManager.getConnection(url,
"myLogin", "myPassword");
여기서 url 은 실제로 Data Source 나 DBMS 를 접근하는 Path 로 이용되고 login id 와 password 를 기술해 주면 됩니다. JDBC-ODBC Bridge 를 이용할 경우 다음과 같이 쓸수 있습니다.

String url = "jdbc:odbc:COFFEEBREAK";
Connection con = DriverManager.getConnection(url, "sangkeun", "1234");

여기서 COFFEEBREAK 는 실제 Data Source 이름이고 sangkeun/1234 의 아이디와 패스워드로 접근을 하게 됩니다.

Statement Object 만들기
Statement stmt = con.createStatement();
Statement Object를 만든 후 다음과 같이 method 를 사용할 수 있습니다.

stmt.executeUpdate("CREATE TABLE COFFEES " +
(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
"SALES INTEGER, TOTAL INTEGER)");

데이타베이스를 조회하는 경우 (Select 문)엔 executeQuery 메소드를 사용하며 갱신하거나 삭제, 삽입등의 경우(Insert, Update, Delete, Create, Alter...)엔 executeUpdate 가 사용됩니다.
ResultSet Object 에서 Data 가져오기
데이타베이스로 부터 select 문을 이용하여 조회한 결과를 JDBC는 ResultSet Object 에저장을 하게 됩니다. ResultSet Object 는 다음과 같이 만들수 있읍니다.

ResultSet rs = stmt.executeQuery( "SELECT COF_NAME, PRICE FROM COFFEES");

ResultSet rs 로부터 데이터를 가져오려면 getXXX() 메소드를 이용하며 next() 메소드를 사용해서 가져온 레코드(row)를 하나씩 읽어 나갈수 있읍니다.
String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
System.out.println(s + " " + n);
}


위의 코드를 다음과 같이 기술하여도 같은 결과를 얻게 됩니다.
String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString(1);
float n = rs.getFloat(2);
System.out.println(s + " " + n);
}


getString(1) 과 getString(2) 는 ResultSet 에서 첫번째, 두번째 요소를 가져옴을 뜻하므로 결과는 같으며, 이렇게 필드명과 필드인덱스를 모두 사용할 수 있습니다. 그리고 ResultSet 의 커서는 항상 첫 레코드 바로 앞에 초기위치 합니다.

PreparedStatement Object 이용하기
PreparedStatement Object 는 좀 더 효과적으로 데이타베이스에 SQL Statement 를 보내기 위해, 만들어 질 때 SQL 문에 파라미터를 바꿔 가면서 수행시킬 수 있도록 하여 실행 횟수를 줄일 수 있습니다. 물론 파라미터 없이도 선언 될 수 있지만 일반적으로 여러 값을 지정 할 수 있도록 만들어 집니다.
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();


다음과 같이 loop 를 이용해서 값을 지정할 수도 있습니다.
PreparedStatement updateSales;
String updateString = "update COFFEES " +
"set SALES = ? where COF_NAME like ?" ;
updateSales = con.prepareStatement(updateString);
Int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso", "Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1, salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
}


Transaction 이용하기
Statement를 수행시킬 때 가끔은 여러 Statement가 모두 수행될 경우에만 데이타 베이스가 업데이트 되도록, 마치 하나의 unit로 수행해야 하는 경우가 있습니다. (Batch 작업처럼) 그럴 경우에 Transaction 을 이용합니다. 먼저 데이타 베이스에 연결이 되면 모든 Statement 는 자동 commit mode로 셋팅이 되므로 transaction 을 수행하려면 Auto Commit 을 false 로 하여야 합니다.

con.setAutoCommit(false);
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");
updateSales.setInt(1, 50);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
PreparedStatement updateTotal = con.prepareStatement(
"UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?");
updateTotal.setInt(1, 50);
updateTotal.setString(2, "Colombian");
updateTotal.executeUpdate();
con.commit();
con.setAutoCommit(true);


같은 시점에 수행이 되며 하나라도 에러가 나면 수행되지 않습니다. con.commit(); 가 수행되는 순간에 모든 statement 가 수행이 되죠. 일반적으로 Transaction 처리는 data 의 일치성이 요구될 때 사용을 합니다. 부분적인 data 의 업데이트로 만약 여러 명이 동시에 하나의 자원을 요청할 경우 data 의 integrity 가 지켜지지 않을 수 있으므로 이런 경우에 유용합니다.

Stored Procedure
Stored Procedure는 거의 모든 DBMS에서 제공을 하는데 Procedure를 미리 만들어 놓고나중에 JDBC 로 부터 호출하여 사용하는 방법입니다.
String createProcedure = "create procedure SHOW_SUPPLIERS " +
"as " +
"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
"from SUPPLIERS, COFFEES " +
"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
"order by SUP_NAME";

Statement stmt = con.createStatement();
stmt.executeUpdate(createProcedure);


위와 같이 procedure를 선언한 후 호출하여 사용합니다.
CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...