(1) Statement 상속관계
==> 서브 인터페이스로 갈수록 향상된 기능을 제공합니다.
- 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() 메서드를 제공하고 있습니다.
1 | String sql = “select age from test1 where id=?”; |
2 | PreparedStatement pstmt = con.prepareStatement(sql); |
3 | pstmt.setString( 1 ,”syh1011”); |
4 | ResultSet rs = pstmt.executeUpdate(); |
(4) Sample Code
- Select 구현하기
03 | import java.sql.Connection; |
04 | import java.sql.PreparedStatement; |
05 | import java.sql.DriverManager; |
06 | import java.sql.SQLException; |
07 | import java.sql.ResultSet; |
09 | public class SelectTest { |
12 | Class.forName( "oracle.jdbc.driver.OracleDriver" ); |
13 | } catch (ClassNotFoundException cnfe){ |
14 | cnfe.printStackTrace(); |
18 | public static void main(String[] args){ |
19 | Connection con = null ; |
20 | PreparedStatement pstmt = null ; |
23 | String dbUrl = "jdbc:oracle:thin:@211.183.2.80:1521:orcl" ; |
25 | String passwd= "tiger" ; |
28 | con = DriverManager.getConnection(dbUrl,id,passwd); |
30 | String sql = "select empno, ename, job, sal, deptno from emp where empno = ?" ; |
31 | pstmt = con.prepareStatement(sql); |
32 | pstmt.setInt( 1 , 7369 ); |
33 | rs = pstmt.executeQuery(); |
35 | System.out.println( "empno \t ename \t job\t sal\t deptno" ); |
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" ); |
44 | } catch (SQLException e){ |
48 | try {rs.close();} catch (Exception e){} |
51 | try {pstmt.close();} catch (Exception e){} |
54 | try {con.close();} catch (Exception e){} |
- Insert 구현하기
28 | con = DriverManager.getConnection(dbUrl,id,passwd); |
30 | System.out.println( "emp 테이블에 데이터를 추가합니다." ); |
32 | String sql = "insert into emp values " + |
33 | "(?,?,?,?,sysdate,?,?,?)" ; |
34 | pstmt = con.prepareStatement(sql); |
35 | pstmt.setInt( 1 , 9001 ); |
36 | pstmt.setString( 2 , "HUH" ); |
37 | pstmt.setString( 3 , "manager" ); |
38 | pstmt.setInt( 4 , 7698 ); |
42 | int count = pstmt.executeUpdate(); |
44 | System.out.println(count+ "개의 행을 추가했습니다." ); |
45 | } catch (SQLException e){ |
<< 출력 결과 >>
emp 테이블에 데이터를 추가합니다.
1개의 행을 추가했습니다.
- Update 구현하기
28 | con = DriverManager.getConnection(dbUrl,id,passwd); |
30 | System.out.println( "emp 테이블에 데이터를 수정합니다." ); |
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( 3 , 9001 ); |
37 | int count = pstmt.executeUpdate(); |
39 | System.out.println(count+ "개의 행을 수정했습니다." ); |
40 | } catch (SQLException e){ |
<< 출력 결과 >>
emp 테이블에 데이터를 수정합니다.
1개의 행을 수정했습니다.
- Delete 구현하기
28 | con = DriverManager.getConnection(dbUrl,id,passwd); |
30 | System.out.println( "emp 테이블에 데이터를 삭제합니다." ); |
32 | String sql = "delete from emp where empno=?" ; |
33 | pstmt = con.prepareStatement(sql); |
34 | pstmt.setInt( 1 , 9001 ); |
35 | int count = pstmt.executeUpdate(); |
37 | System.out.println(count+ "개의 행을 삭제했습니다." ); |
38 | } catch (SQLException e){ |
<< 출력 결과 >>
emp 테이블에 데이터를 삭제합니다.
1개의 행을 삭제했습니다.
출처 - http://jjup77.blog.me/50111883892
댓글 없음:
댓글 쓰기