JDBC 프로그래밍


1. 테이블 만들고 입력하기 (p828 참조)


오라클을 연동시킨 이클립스 SQL창에서 다음과 같이 테이블을 만들고 데이터를 입력한다. 

(오라클의 SQL 기초문법은 오라클 기초 항목 참조 : 테이블 DDL, SELECT문)


create table goodsinfo (

code char(5) not null,

name varchar2(30) not null,  -- 오라클에서는 SQL처럼 varchar가 아니라 varchar2

price number(8) not null,     -- 오라클에서는 SQL처럼 int가 아니라 number

maker varchar2(20),

primary key(code)

);


insert into goodsinfo(code, name, price, maker)

values('10001', '디지털TV', 350000, 'LG');


insert into goodsinfo(code, name, price, maker)

values('10002', 'DVD 플레이어', 250000, 'LG');


insert into goodsinfo(code, name, price, maker)

values('10003', '디지털 카메라', 210000, '삼성');


insert into goodsinfo(code, name, price, maker)

values('10004', '전자사전', 100000, '아이리버');


insert into goodsinfo(code, name, price, maker)

values('10005', '벽걸이 에어컨', 400000, '삼성');


select * from goodsinfo;


goodsinfo라는 테이블을 만들고 insert로 데이터를 넣은 다음 select로 확인해보면 다음과 같다.





2. JDBC (835 참조)

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API.

자바 프로그램에서 데이터베이스를 사용하는 과정은 다음과 같다.


JDBC 프로그래밍 순서


1) JDBC 드라이버를 로드 Class.for.Name("드라이버 클래스 이름"); 

ex) Class.forName("oracel.jdbc.driver.OracleDriver");

ex) Class.forNmae("com.mysql.jdbc.Driver");


2) DB에 연결 Connection conn = DriverManager.getConnection(URL, "사용자ID", "패스워드");


※ 데이터베이스의 URL 포멧은 프로토콜:서브프로토콜://IP주소:포트번호/DB이름

ex) jdbc:mysql://219.153.12.14:3306/dbname

ex) jdbc:oracle:thin@219.153.12.14:3306/dbname


3) DB에 데이터를 읽거나 쓴다.


4) DB연결을 끊는다.

conn.close();


※ 파일 입출력 클래스와 마찬가지로 익셉션 처리를 하지 않으면 작동하지 않는다.




JDBC 프로그래밍 예제


1) JDBC 드라이버를 로드하고 데이터베이스에 연결하는 프로그램


import java.sql.*;

public class Jdbc01 {


public static void main(String[] args) {

String driver = "oracle.jdbc.driver.OracleDriver"; // 드라이버 로드. " " 안은 오라클 드라이버 이름

String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe" ;// 데이터베이스의 url 형식 (@뒤에는 접속할 IP:DB명)

Connection con = null;

try {

Class.forName(driver); // 드라이버 로딩

con = DriverManager.getConnection(url, "st02", "st02"); // 연결. (url, "ID", "패스워드")

// 데이터를 읽거나 쓰는 것을 넣을 부분.

System.out.println("Connection OK!!");

} catch (Exception e) {

System.out.println("해당 클래스를 찾을 수 없습니다." + e.getMessage());

} finally {

try {

if (con != null)

con.close(); // 데이터베이스 연결 끊기

} catch (Exception e) {

System.out.println(e.getMessage());

}

}

}

}

※ 위에서는 driver와 url이 너무 길기 때문에 String 변수로 선언 후 사용했는데, 아래와 같이 변수 없이 곧바로 사용도 가능하다.

Class.forName(oracle.jdbc.driver.OracleDriver);

con = DriverManager.getConnection(jdbc:oracle:thin:@211.183.9.66:1521:xe, "st02", "st02");


위의 프로그램을 실행시키기 위해서는 먼저 이클립스의 왼쪽 package Explorer에서 JDBC를 실행할 프로젝트를 선택 후, 마우스 오른쪽 버튼을 눌러 최하단의 Properties를 선택한다.(Alt+엔터)

다음 왼쪽의 Java Build Path를 선택, Libraries탭에서 Add JARs를 선택하여, 오라클에서 받은 ojdbc6.jar를 선택하고 OK.


위의 프로그램을 실행시켜서 Connection OK!!가 나왔으면 성공!




이제 데이터를 읽거나 쓰는 부분에 오라클에서 입력한 데이터베이스를 가져오는 부분을 넣어보자.


책에서는 데이터를 읽어오는 인터페이스 Statement가 소개되었는데, 

아래의 예제에서는 ? 를 사용할 수 있는 PreparedStatement를 사용하였다. 


(P841 참조)

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT CODE, NUM FROM GOODSINFO);


(아래 예제의 경우)

PreparedStatement pstmt = con.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();


---------------------------------------------------------------------------------------------------


2) JDBC 드라이버를 로드하여 데이터베이스를 가져와 출력하는 프로그램


import java.sql.*;

public class Jdbc02 {


public static void main(String[] args) {

String driver = "oracle.jdbc.driver.OracleDriver"; 

String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";

String sql = "SELECT * FROM GOODSINFO"; // 데이터베이스에서 실행할 SQL 명령문


Connection con = null; 

PreparedStatement pstmt = null; // SQL쿼리 제어 객체 

ResultSet rs = null; // SELECT 쿼리의 결과값 제어 객체


try {

Class.forName(driver);

con = DriverManager.getConnection(url, "st02", "st02");

pstmt = con.prepareStatement(sql);

rs = pstmt.executeQuery(); // executeQuery()은 SELECT문에 사용

// executeUpdate()는 INSERT, UPDATE, DELETE문에 사용

while (rs.next()) {

String code = rs.getString("CODE"); // 해당필드를 가져옴

String name = rs.getString("NAME"); // " "안은 필드명

int price = rs.getInt("PRICE");

String maker = rs.getString("MAKER");

// 이 필드를 차곡차곡 저장할 것이면 ArrayList로 넘겨줘야 함. jsp에서 다룰 예정

System.out.println(code + "\t" + name + "\t" + price + "\t" + maker);

}

}


catch (Exception e) {

System.out.println(e.getMessage());

}


finally {

try {

rs.close();

pstmt.close();

con.close();

} catch (Exception e) {

}

}


}

}


3) 결과

10001 디지털TV 350000 LG

10002 DVD 플레이어 250000 LG

10003 디지털 카메라 210000 삼성

10004 컬러액정 전자사전 300000 아이리버

10005 벽걸이 에어컨 400000 삼성


-------------------------------------------

2-B) PreparedStatement 대신 책에 나온 Statement를 쓴 경우

(driver, url을 별도 변수에 담지 않고 곧바로 사용, ResultSet도 선언과 동시에 사용)


import java.sql.*;

public class JDBCExample1 {

public static void main(String[] args) {


Connection conn = null;

Statement stmt = null; // Statement를 사용한 SQL쿼리 제어 객체

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

conn = DriverManager.getConnection("jdbc:oracle:thin:@211.183.9.66:1521:xe", "st02", "st02");

stmt = conn.createStatement(); // Statement 객체를 만드는 createStatement 메소드를 호출

ResultSet rs = stmt.executeQuery("SELECT * FROM GOODSINFO"); // 1줄 표현 가능

while(rs.next()){

String code = rs.getString("CODE");

String name = rs.getString("NAME");

int price = rs.getInt("PRICE");

String maker = rs.getString("MAKER");

System.out.println(code + "\t" + name + "\t" + price + "\t" + maker);

}

}

catch(Exception e) {System.out.println(e.getMessage());}

finally {

try {  rs.close();

pstmt.close();

conn.close();

}

catch(Exception e) {System.out.println(e.getMessage());}

}

}

}

위와 같이 해도 결과는 PreparedStatement를 사용했을 때와 동일하다. 

---------------------------------------------------------------------------------------------------


3) 상품코드와 가격을 입력받아 데이터베이스의 가격을 수정하는 프로그램


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;


public class Jdbc03 {


public static void main(String[] args) {

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";

String sql = "UPDATE GOODSINFO SET PRICE = ? WHERE CODE = ?";

// 입력받을 가격과 코드 위치에는 ?를 넣어둠.

Connection con = null;

PreparedStatement pstmt = null; // SQL쿼리 제어 객체

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "st02", "st02");

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 450000); // 1번째 ?에 해당하는 price값을 설정해줌.

pstmt.setString(2, "10005"); // 2번째 ?에 해당하는 code값을 설정해줌.

int cnt = pstmt.executeUpdate(); 

// executeUpdate()는 insert, update, delete문에 사용

//cnt가 사용되지 않아 경고 뜨지만 문법을 보여주기 위해서 사용. 

// 출력하면 몇 건이 적용되었는지 나옴.

}


catch (Exception e) {

System.out.println(e.getMessage());

}


finally {

try {

pstmt.close();

con.close();

} catch (Exception e) {

}

}

}

}

이 프로그램을 실행시키면 오라클에서 "update goodsInfo set price = 450000 where code = 10005"를 실행시킨 것과 같은 결과가 나온다. 즉, 코드가 10005에 해당하는 상품의 가격이 450000로 변경된다. 2번 프로그램(Jdbc02)을 실행시켜 결과를 확인하면 다음과 같다.

3) 결과

10001 디지털TV 350000 LG

10002 DVD 플레이어 250000 LG

10003 디지털 카메라 210000 삼성

10004 컬러액정 전자사전 300000 아이리버

10005 벽걸이 에어컨 450000 삼성



만일 위와 같이 ?를 입력하지 않고 직접 가격을 넣고 싶다면 sql문에 직접 숫자를 넣고 executeUpdate를 실행시켜줘도 된다.
?를 쓰는 것은 값을 Scanner 등으로 직접 입력받아 쓸 수도 있게 처리하기 때문.

내 나름대로의 응용예제 3-A) 
상품코드와 가격을 입력받아 데이터베이스의 가격을 수정하는 프로그램 (숫자를 sql문에 직접 써넣은 경우)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Jdbc03a {

public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";
String sql = "UPDATE GOODSINFO SET PRICE = 50000 WHERE CODE = 10002"; 
Connection con = null;
PreparedStatement pstmt = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "st02", "st02");
pstmt = con.prepareStatement(sql);
int cnt = pstmt.executeUpdate(); // 실행! 
System.out.println(cnt);
}

catch (Exception e) {
System.out.println(e.getMessage());
}

finally {
try {
pstmt.close();
con.close();
} catch (Exception e) {
}
}
}
}


내 나름대로의 응용예제 3-B) 
상품코드와 가격을 입력받아 데이터베이스의 가격을 수정하는 프로그램 (scanner로 직접 입력받음)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.*;
public class Jdbc03b {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";
String sql = "update goodsInfo set price = ? where code = ?";
Connection con = null;
PreparedStatement pstmt = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "st02", "st02");
pstmt = con.prepareStatement(sql);
System.out.printf("수정할 코드 입력: ");
String code = scan.next(); 
System.out.printf("수정할 가격 입력: ");
int price = scan.nextInt();
pstmt.setInt(1, price);
pstmt.setString(2, code);
int cnt = pstmt.executeUpdate(); 
System.out.println(cnt + "건이 수정되었습니다.");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
finally {
try {
scan.close();
pstmt.close();
con.close();
} catch (Exception e) {
}
}
}
}

결과) 
수정할 코드 입력: 10002
수정할 가격 입력: 50000
1건이 수정되었습니다.

이 프로그램에서 원하는 코드와 가격을 입력 후 위의 Jdbc02로 데이터베이스를 확인하면 이 프로그램에서 입력한대로 변경된 것을 확인할 수 있다.



---------------------------------------------------------------------------------------------------


문제) 위의 Jdbc03 예제를 활용해서 10001 상품을 지우는 프로그램을 작성하라.


import java.sql.*;

public class Jdbc04 {


public static void main(String[] args) {

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";

String sql = "DELETE FROM GOODSINFO WHERE CODE = ?"; // 오라클에서 쓸 SQL문 넣어두기

Connection con = null;

PreparedStatement pstmt = null;

try {

Class.forName(driver);

con = DriverManager.getConnection(url, "st02", "st02");

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 10001); // 1번째 ?에 들어갈 값을 설정

int cnt = pstmt.executeUpdate(); // 실행

System.out.println(cnt); // 위의 cnt를 실행하려고 일부러 출력함.

  // 삭제된 데이터는 1건이므로 1이라고 출력됨.

}


catch (Exception e) {

System.out.println(e.getMessage());

}


finally {

try {

pstmt.close();

con.close();

} catch (Exception e) {

}

}


}

}


결과) 

위의 프로그램을 실행시키면 삭제된 데이터가 1건이므로 1이 출력된다. 다음 Jdbc02를 실행시켜 데이터베이스 현황을 출력하면 다음과 같이 10002 항목이 delete 된 것을 확인할 수 있다.

10002 DVD 플레이어 250000 LG
10003 디지털 카메라 210000 삼성
10004 컬러액정 전자사전 300000 아이리버
10005 벽걸이 에어컨 450000 삼성


---------------------------------------------------------------------------------------------------

내 나름대로의 응용예제 3-C) 
상품코드, 상품명, 가격, 메이커를 입력받아 데이터베이스에 반영하는 프로그램 (scanner로 직접 입력받음)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.*;
public class Jdbc03c {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";
String sql = "INSERT INTO GOODSINFO(CODE,NAME,PRICE,MAKER) VALUES(?, ?, ?, ?)";
// 실제 SQL문에서 문자열은 ' '로 묶어야 하지만 위에서는 그냥 ?로만 처리해도 됨.
Connection con = null;
PreparedStatement pstmt = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, "st02", "st02");
pstmt = con.prepareStatement(sql);
System.out.printf("입력할 코드: ");
String code = scan.next();
System.out.printf("입력할 상품명: ");
String name = scan.next();
System.out.printf("입력할 가격: ");
int price = scan.nextInt();
System.out.printf("입력할 메이커: ");
String maker = scan.next();
pstmt.setString(1, code);
pstmt.setString(2, name);
pstmt.setInt(3, price);
pstmt.setString(4, maker);
int cnt = pstmt.executeUpdate(); // 실행. cnt는 실행 건수 표시
System.out.println(cnt + "건이 실행되었습니다."); 
}
catch (Exception e) {
System.out.println(e.getMessage());
}
finally {
try {
scan.close();
pstmt.close();
con.close();
} catch (Exception e) {
}
}
}
}
결과)
입력할 코드: 10001
입력할 상품명: MD플레이어
입력할 가격: 990000
입력할 메이커: 소니
1건이 실행되었습니다.

위의 프로그램 실행 후 입력한 값이 데이터베이스에 반영된다. Jdbc02를 실행시켜 데이터베이스 내용을 확인하면 다음과 같다.

10001 MD플레이어 990000 소니
10002 DVD 플레이어 50000 LG
10003 디지털 카메라 210000 삼성
10004 컬러액정 전자사전 300000 아이리버
10005 벽걸이 에어컨 450000 삼성


---------------------------------------------------------------------------------------------------






Posted by netyhobby
,