2012년 5월 19일

JDBC PreparedStatement 객체활용




(1) Statement 상속관계
==> 서브 인터페이스로 갈수록 향상된 기능을 제공합니다.

















(2) PreparedStatement 기능
- PreparedStement SQL문의 구조는 동일하나 조건이 다른 문장을 변수 처리함으로써 항상 SQL문을
  동일하게 처리할 수 있는 인터페이스입니다.

- PreparedStement로 SQL을 사용하면 LIBRARY CACHE에 저장된 세 가지 작업을 재사용해서
  수행 속도를 좀 더 향상시킬 수 있습니다.





























- DBMS의 내부 동작과정
i) SQL문 전송하게 되면 오라클은 내부적으로 PARSING => EXECUTE PLAN => FETCH 작업을 합니다.
ii) 3가지 작업 후에 검색한 결과는 SGA 영역 안의 Data Buffer Cache영역에 블락단위로 저장합니다.
iii) SQL문과 PARSING한 결과와 실행계획을 SHARED POOL안에 LIBRARY CACHE에 저장하게 됩니다.
iv) 똑같은 SQL문을 전송하면 LIBRARY CACHE에 저장된 SQL문과 PARSING한 결과와
   실행계획을 그대로 사용하게 된다.
v) 똑같은 SQL문이라도 대소문자가 하나라도 틀리거나 SQL문이 다르다면 LIBRARY CACHE에 저장된
    3가지 작업을 재사용할 수 없고, 다시 PARSING => EXECUTE PLAN => FETCH 작업을 수행


(3) PreparedStatement 사용 방법
- PreparedStatement SQL문은 SQL문의 구조는 같은데 조건이 수시로 변할 때 조건의 변수처리를
   “?” 로 하는데 이를 바인딩 변수라 합니다바인딩 변수는 반드시 컬럼 명이 아닌 컬럼 값이 와야 합니다.

바인딩 변수의 순서는 “?” 의 개수에 의해 결정이 되는데 시작 번호는 1 부터 시작하게 됩니다.

바인딩 변수에 값을 저장하는 메서드는 오라클의 컬럼 타입에 따라 지정해 주면 됩니다.
   전의 ResultSet getXXX() 메서드와 유사하게 PreparedStatement 인터페이스에는 바인딩 변수에 값을
   저장하는 setXXX() 메서드를 제공하고 있습니다.

1String sql = “select age from test1 where id=?”;
2PreparedStatement pstmt = con.prepareStatement(sql);
3pstmt.setString(1,”syh1011”);
4ResultSet rs = pstmt.executeUpdate();


(4) Sample Code
- Select 구현하기
01package com.base2;
02
03import java.sql.Connection;
04import java.sql.PreparedStatement;
05import java.sql.DriverManager;
06import java.sql.SQLException;
07import java.sql.ResultSet;
08
09public class SelectTest {
10    static{
11        try{
12            Class.forName("oracle.jdbc.driver.OracleDriver");
13        }catch(ClassNotFoundException cnfe){
14            cnfe.printStackTrace();
15        }  
16    }
17     
18    public static void main(String[] args){
19        Connection con = null;
20        PreparedStatement pstmt = null;
21        ResultSet rs= null;
22         
23        String dbUrl = "jdbc:oracle:thin:@211.183.2.80:1521:orcl";
24        String id="scott";
25        String passwd="tiger";
26
27        try{
28            con = DriverManager.getConnection(dbUrl,id,passwd);
29             
30            String sql = "select empno, ename, job, sal, deptno from emp where empno = ?";
31            pstmt = con.prepareStatement(sql);
32            pstmt.setInt(17369);         
33            rs = pstmt.executeQuery();
34             
35            System.out.println("empno \t ename \t job\t sal\t deptno");
36             
37            if(rs.next()){
38                System.out.print(rs.getInt("empno")+"\t");
39                System.out.print(rs.getString("ename")+"\t");
40                System.out.print(rs.getString("job")+"\t");
41                System.out.print(rs.getInt("sal")+"\t");
42                System.out.print(rs.getInt("deptno")+"\n");
43            }
44        }catch(SQLException e){
45            e.printStackTrace();
46        }finally{          
47            if(rs != null){
48                try{rs.close();}catch(Exception e){}
49            }
50            if(pstmt != null){
51                try{pstmt.close();}catch(Exception e){}
52            }
53            if(con != null){
54                try{con.close();}catch(Exception e){}
55            }
56        }
57    }
58}

- Insert 구현하기 
27        try{
28            con = DriverManager.getConnection(dbUrl,id,passwd);
29             
30            System.out.println("emp 테이블에 데이터를 추가합니다.");
31             
32            String sql = "insert into emp values " +
33                    "(?,?,?,?,sysdate,?,?,?)";
34            pstmt = con.prepareStatement(sql);
35            pstmt.setInt(19001);
36            pstmt.setString(2"HUH");
37            pstmt.setString(3"manager");
38            pstmt.setInt(47698);
39            pstmt.setInt(5900);
40            pstmt.setInt(6300);
41            pstmt.setInt(710);           
42            int count = pstmt.executeUpdate();
43             
44            System.out.println(count+"개의 행을 추가했습니다.");         
45        }catch(SQLException e){
<< 출력 결과 >>
emp 테이블에 데이터를 추가합니다.
1개의 행을 추가했습니다.

- Update 구현하기
27        try{
28            con = DriverManager.getConnection(dbUrl,id,passwd);
29             
30            System.out.println("emp 테이블에 데이터를 수정합니다.");
31             
32            String sql = "update emp set ename=?,job=? where empno=?";
33            pstmt = con.prepareStatement(sql);
34            pstmt.setString(1"HUH");
35            pstmt.setString(2"ANALIST");
36            pstmt.setInt(39001);         
37            int count = pstmt.executeUpdate();
38             
39            System.out.println(count+"개의 행을 수정했습니다.");         
40        }catch(SQLException e){
<< 출력 결과 >>
emp 테이블에 데이터를 수정합니다.
1개의 행을 수정했습니다.

- Delete 구현하기
27        try{
28            con = DriverManager.getConnection(dbUrl,id,passwd);
29             
30            System.out.println("emp 테이블에 데이터를 삭제합니다.");
31             
32            String sql = "delete from emp where empno=?";
33            pstmt = con.prepareStatement(sql);
34            pstmt.setInt(19001);         
35            int count = pstmt.executeUpdate();
36             
37            System.out.println(count+"개의 행을 삭제했습니다.");         
38        }catch(SQLException e){
<< 출력 결과 >>
emp 테이블에 데이터를 삭제합니다.
1개의 행을 삭제했습니다.

출처 - http://jjup77.blog.me/50111883892

댓글 없음:

댓글 쓰기