Datebase

JDBC(Java Database Connectivity) - 자바 라이브러리

엘호리스 2018. 1. 23. 12:37

JDBC(Java Database Connectivity) - Oracle을 활용한 JSP와 DB연동


오라클 설치

http://www.oracle.com를 방문하고 Downloads 메뉴에서 Oracle Database 11g Express Edition1을 선택한다.

JDBC 드라이버 설치

오라클 JDBC드라이버 경로
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
디렉토리에 있는 파일 중 ojdbc6.jar 가 우리가 사용할 JDBC 드라이버이다.



[작업할 프로젝트 마우스 우클릭]

[Build Path] -> [Configure Build Path...]



[Libraries 탭] -> [Add External JARs]



C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar


JSP와 데이터베이스 연동

JDBC 프로그램의 작성 단계

  1. JDBC 드라이버 Load
  2. Connection 객체 생성
  3. Statement/PreparedStatement/CallableStatement 객체 생성
  4. Query 수행
  5. ResultSet 처리
  6. 연결 해제



1. JDBC 드라이버 Load


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


cs



1단계(JDBC 드라이버 Load) : 인터페이스 드라이버(interface driver)를 구현(implements)하는 작업으로, Class 클래스의 forName() 메소드를 사용해서 드라이버를 로드.


2. Connection 객체 생성

1
Connection conn=
DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl""scott""tiger");
cs

JDBC API는 대부분 인터페이스이다. DriverManager는 우리 예제에서 유일하게 온전한 클래스다. DriverManager는 이름 그대로 데이터베이스 벤더들이 선의 JDBC API를 구현한 드라이버를 관리한다. DriverManager.getConnection(,,) 메서드는 인자로 들어오는 값에 따라서 특정 데이터베이스 벤더가 구현한 Connection 타입의 객체를 반환한다. Connection 객체가 생성은 데이터베이스와 연결이 확립되었음을 의미한다.


3. Statement/PrepardStatement/CallableStatement 객체 생성

1
2
// Statement 객체 생성
Statement stmt = conn.createStatement();
cs



Statement 객체 생성을 하면서 Statement 객체의 메소드를 사용할수 있다.

4. Query 수행

1
2
// SQL문을 실행한다.
ResultSet rs = stmt.executeQuery(query);
cs

 ① executeQuery 메소드

     : 하나의 ResultSet을 만드는 SQL문에서 사용(executeQyery 메소드는 ResultSet 객체를 리턴한다.)

     : 주로 SELECT문을 이용하는 조회에서 사용됨.



1
2
// sql문 실행과 성공한 row수 반환 => Insert 문, Update 문, Delete 문에서 사용
int aftcnt = stmt.executeUpdate(sql);

cs


② executeUpdate 메소드

     : INSERT, UPDATE, DELETE 등 (DML), CREATE, DROP 등(DDL)문들을 실행하는데 사용

       └ DML을 사용할 경우 리턴값 : 작용한 열의 개수(갱신 카운트로 간주되는)를 나타내는 정수

       └ DDL을 사용할 경우 리턴값 : 0을 리턴(DML을 실행 후 아무런 영향을 주지 않은 경우에도 '0'을 리턴한다.)


5. ResultSet 처리

1
2
3
4
5
6
7
8
while( rs.next()  ) {
    Emp emp = new Emp( rs.getInt("empno"),
    rs.getString("ename"), rs.getString("job"),
    rs.getInt("mgr"), rs.getString("hiredate"), 
    rs.getDouble("sal"),rs.getDouble("comm"), 
    rs.getInt("deptno"));
    empList.add(emp);
}
cs



5단계(ResultSet 처리) : executeQuery()메소드는 수행 결과로 ResultSet을 반환.

ResultSet 객체로부터 원하는 데이터를 추출.

데이터를 추출하는 방법은 ResultSet 객체에서 next()메소드를 사용해

한 행씩 이동하면서 getXxx()를 이용해서 원하는 필드 값을 추출.

문자열 데이터를 갖는 필드는 rs.getString("name") 혹은 rs.getString(1) 로 사용.

ResultSet의 첫 번째 필드는 1부터 시작.

rs.getString("name")과 같이 필드명을 사용하는 것이 권장 형태.

6. 연결 해제 - Close

1
2
3
4
5
6
// ResultSet를 닫는다.
rs.close();
// Statement를 닫는다.
stmt.close();
// Connection를 닫는다.
conn.close();
cs

JDBC 프로그래밍에서 자원 반환은 정말 중요하다. 객체가 더이상 쓰이지 않을 때 가베지 컬렉터가 동작한다고 했는데 예외가 있다. 가베지 컬렉터는 객체 자체가 열심히 동작하고 있다고 판단되면 그 객체를 회수하지 않는다. JDBC와 관련된 객체가 이런 객체에 속한다. 따라서 JDBC와 관련된 작업이 끝나면 생성된 객체 자원을 반환해야 한다. 그러기 위해서 자원 반환 코드 조각을 finally 블록에 구현한다. finally 블록은 익셉션이 발생하건 안 하건 실행되는 블록이다. 다음 코드를 finally 블록에 구현해야 한다.


JDBC 프로그래밍에 사용되는 객체

① DriverManager 클래스

1
2
3
4
5
6
7
8
9
try {
    // 드라이버를 로딩한다.
    Class.forName("oracle.jdbc.driver.OracleDriver");
    // 한번에 예외처리할때
    Connection conn
     = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
catch (ClassNotFoundException e ) {
    e.printStackTrace();
}
cs

② Connection 클래스

1
2
3
// getConnection() 메소드를 사용해 Connection 객체 conn을 생성
Connection conn = DriverManager.getConnection(
    DB_URL, DB_USER, DB_PASSWORD);
cs

③ Statement 인터페이스

1
2
3
4
5
try { // Statement 객체는 Connection 클래스의 createStatement() 메소드로 생성
     Statement stmt = conn.createStatement();
catch (Exception e) {
     e.printStackTrace();
}
cs

④ PreparedStatement 인터페이스

1
2
3
4
5
6
7
8
9
10
11
try {
    String sql="insert into emp values(?,?,?)";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1,101);
    pstmt.setString(2,"Ratan");  
  
    int i=stmt.executeUpdate();
 
catch (Exception e) {
    e.printStackTrace();
}
cs

⑤ CallableStatement 인터페이스

1
2
3
4
5
try { // Connection 객체의 prepareCall() 메소드로 CallableStatement 객체 생성
     CallableStatement cstmt = conn.prepareCall();
catch (Exception e) {
     e.printStackTrace();
}
cs

⑥ ResultSet 인터페이스

SQL문이 select 문이면 반환한 레코드를 저장할 객체가 필요하다. 이때 레코드를 담는 그릇이 ResultSet이다


1
2
3
4
5
6
7
8
9
10
// Select문을 반환 데이터를 저장할 객체가 ResultSet이다.
ResultSet rs = stmt.executeQuery(sql);
System.out.println("----"+input_name+"님 글 검색 결과-------");
while(rs.next()){
   int idx=rs.getInt(1);
   String name=rs.getString(2);
   String msg=rs.getString(3);
   Date wdate=rs.getDate(4);
   System.out.println(idx+"\t"+name+"\t"+msg+"\t"+wdate);
}
cs


1) ResultSet.next() : Cursor를 다음 Row로 이동
2) ResultSet.previous() : Cursor를 이전 Row로 이동
3) ResultSet.first() : Cursor를 ResulSet의 처음으로 이동
4) ResultSet.last() : Cursor를 ResulSet의 마지막으로 이동
5) ResultSet.isFirst() : 현재 Cursor가 첫 Row인지를 확인
6) ResultSet.isLast() : 현재 Cursor가 마지막 Row인지를 확인
7) ResultSet.getType() : ResultSet의 Type을 Return (Type은 아래 참조 (A))
8) ResultSet.getCucurrency() : Concurrency의 Type을 Return (Type은 아래 참조 (B))
9) ResultSet.getRow() : 현재 Cursor가 가리키고 있는 Row Number


참고자료

자바스쿨 JDBC 학습자료 - http://java-school.net/jdbc/JDBC-Intro