[JDBC] 03 3일째

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 다음과 같이 하지 말 것!!!

SQL> select * from emp;

SQL> SELECT * from emp;

SQL> Select * from Emp;


-> 결과는 모두 같다. 그러나, 오라클 서버에 걸리는 부하가 커진다.


SQL> select * from emp;

-> 이걸 실행하면 오라클 서버는 임시 메모리 버퍼에 이 명령에 대한 결과를 저장한다.

-> 그래서 다음번에 같은 명령이 내려오면

SQL> select * from emp;

-> 원래 갖고 있던 결과를 보여준다.


그러나 위의 경우와 같이 대소문자가 섞이면, 각각 다른 명령으로 인식하여 부하가 커지게 된다.


★ createStatement, prepareStatement

최근에는 createStatement 를 사용하지 않는다.

prepareStatement 를 사용하면 오라클에 이미 저장되어 있는 명령어의 경우에는 그 결과를 가져오고 없을 경우에는 새로 결과를 만들어내므로, 항상 결과를 새로 만들어내는 createStatement 보다 오라클 서버에 걸리는 부하가 적다.


PreparedStatement 클래스의 객체는 Statement 클래스와는 다르게 객체를 생성하면서 기준 Query를 만들어 둔다. 이것은 동적 Query의 기초가 되는 것임과 동시에 하나의 특정 Query에 대해 조건만 바뀐 상태의 빠른 실행을 만들어 줄 수 있다. 필요한 부분을 "?"로 체크한 후 원하는 값을 해당 위치에 배치할 수 있다.


/*******************************************************************************************
*   파일        : BatchTest.java
*   용도        : addBatch, executeBatch 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;

public class BatchTest
{
 /**
  * @param args
  */
 public static void main(String[] args)
 {
  // TODO Auto-generated method stub
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
       
        // 실제 현장에서는 url, id, pw 등을 텍스트 파일로 저장해 놓고,
        // 그걸 읽어와서 사용하는 방식으로 한다.
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(url, id, pw);
            stmt = con.createStatement();
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            // Batch에 실행할 SQL문을 저장한다. 실행은 하지 않는다. 할 작업만 모아 놓는다.
            stmt.addBatch("insert into test10_tbl values(11, 'test01', '김종식', 20)");
            stmt.addBatch("insert into test10_tbl values(21, 'test02', '이종식', 21)");
            stmt.addBatch("insert into test10_tbl values(31, 'test03', '삼종식', 22)");
            stmt.addBatch("insert into test10_tbl values(41, 'test04', '사종식', 23)");
           
            // 위에서 모아놓은 작업을 한꺼번에 실행한다.
            // int[] batchCnt 에는 변경된 행의 수가 차례로 저장된다. 여기서는 1, 1, 1, 1.
            int[] batchCnt = stmt.executeBatch();
           
            System.out.println("-----------------배치 작업 이후의 테이블 정보-------------");
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            for(int i =0; i < batchCnt.length; i++)
                System.out.println(batchCnt[i]);
           
            stmt.close();
            con.close();           
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
 }

}


/*******************************************************************************************
*   파일        : ExecuteTest.java
*   용도        : execute 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;
import java.io.*;
import java.net.*;

public class ExecuteTest{
  public static void main (String args [])  {
   Connection conn = null;
   Statement stmt = null;
   ResultSet rs = null;
   String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
   String id = "tikle00";
   String pw = "tikle1234";
 try{
  Class.forName ("oracle.jdbc.driver.OracleDriver");
  conn = DriverManager.getConnection(url,id,pw);  
  stmt = conn.createStatement ();

  System.out.println("다음 중 작업을 선택하세요.");
  System.out.println("1. select * from test10_tbl;");
  System.out.println("2. insert into test10_tbl values(11,'test99','김종식',22);");

        // System.in 만으로는 1byte만 받으므로, 한글 등의 입력이 불가
        // InputStreamReader 가 1byte로 입력받은 것을 2bytes로 바꿔주므로, 한글 입력도 가능
        // BufferedReader 는 데이터를 모아서 한꺼번에 처리해준다. 속도의 비약적인 향상
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String choice = br.readLine();

  String sql=null;

  if(choice.equals("2")){
   sql="insert into test10_tbl values(11,'test99','김종식',22)";
  }
  else {
   sql="select * from test10_tbl";
  }

        // insert, create 등은 executeUpdate() 를 통해서 실행해야하고,
        // select 문은 executeQuery() 를 통해서 실행해야 하므로,
        // 어떤게 실행될 지 모르는 지금은 둘 다 실행할 수 있는 execute() 를 통해서 실행한다.
  boolean result = stmt.execute(sql);
        // execute() 의 결과로는, select 문이 실행되었을 경우 true,
        // 그 외의 문이 실행되었을 경우에는 false 가 반환된다.
  // 따라서 result 가 true 면 select 문이 실행되어 그 결과가 있으므로 rs를 통해서 결과를 출력한다.
  if(result) {
   System.out.println("조회 결과는 다음과 같습니다.");
   rs = stmt.getResultSet();
   while (rs.next()) {//ResultSet의 각 레코드행 이동
    String s=rs.getString("num")+"\t";
    s += rs.getString("id")+"\t";
    s += rs.getString("name")+"\t";
    s += rs.getString("age");

    System.out.println(s);
      }
     }else {
   System.out.println("변경된 행의 수는 : " + stmt.getUpdateCount());
  }
 }catch(SQLException e){
  e.printStackTrace();
 }catch(Exception e){
  e.printStackTrace();
 }
  }
}


/*******************************************************************************************
*   파일        : SelectPreTest.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;

public class SelectPreTest{
 public static void main (String args []) {
  if(args.length < 1){
   System.out.println("검색할 num 조건을 입력하세요.");
   return;
  }

  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
  String id = "lonelycat";
  String pw = "ora123";
  try{
   Class.forName ("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url,id,pw);
   
   pstmt = conn.prepareStatement( "select * from test10_tbl where num >= ?");
   pstmt.setInt(1,Integer.parseInt(args[0]));
   
   rs=pstmt.executeQuery();

   while(rs.next()){
    System.out.println(rs.getInt("num") + " : " + rs.getString("id") + " : " + rs.getString("name") + " : " + rs.getInt("age"));
   }
   pstmt.close();
   conn.close();
  } catch (SQLException e){
   e.printStackTrace();
  } catch (ClassNotFoundException e){
   e.printStackTrace();
  } catch (Exception e){
   e.printStackTrace();
  }
 }
}


/*******************************************************************************************
*   파일        : Exam04_01.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;
 
public class Exam04_01 {
    public static  void main(String[] args){
        Connection conn = null;
     PreparedStatement pstmt = null;
     String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
     String user = "lonelycat";      
     String passwd = "ora123";
 
     try {
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        conn = DriverManager.getConnection(url, user, passwd);
                   
        String sql = "insert into test10_tbl values( ?, ?, ?, ?)";
        pstmt = conn.prepareStatement(sql); //SQL문 전송 객체 생성

        pstmt.setInt(1, 100 ); //데이타 인덱스별 설정
        pstmt.setString(2, "id_temp");
        pstmt.setString(3, "작업맨" );
        pstmt.setInt(4, 30 );

        int result = pstmt.executeUpdate(); //질의문 수행
            
        System.out.println(result + "개의 Data 입력 성공!!");
     }catch(Exception e) {
        System.out.println(e.getMessage());
     }finally {
        try{  if(pstmt != null) pstmt.close();
              if(conn != null)  conn.close();
        }catch(Exception ex) {}
     }
  }    
}// class end



/*******************************************************************************************
*   파일        : SearchZipcode.java
*   용도        : 우편번호 검색 프로그램
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

public class SearchZipcode
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
       
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        String dong = "";
        String result = "";
        String result2 = "";
        int i = 0;  // vector 용
        Vector dongList = new Vector();
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");           
            conn = DriverManager.getConnection(url,id,pw);
           
            pstmt = conn.prepareStatement( "select * from zipcode where dong like ?");
           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           
            while(true)
            {
                System.out.print("동 이름을 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            pstmt.setString(1,"%" + dong + "%");
           
            rs=pstmt.executeQuery();
           
            // 1차 결과 출력
            while(rs.next())  
            {//ResultSet의 각 레코드행 이동
                result = rs.getInt("SEQ") + "\t"
                        + rs.getString("ZIPCODE").trim() + " "
                        + rs.getString("SIDO").trim() + " "
                        + rs.getString("GUGUN").trim() + " "
                        + rs.getString("DONG").trim() + " "
                        + rs.getString("RI").trim() + " "
                        + rs.getString("BLDG").trim() + " "
                        + rs.getString("ST_BUNJI").trim() + " "
                        + rs.getString("ED_BUNJI").trim();
               
                result2 =   rs.getString("ZIPCODE").trim() + " "
                            + rs.getString("SIDO").trim() + " "
                            + rs.getString("GUGUN").trim() + " "
                            + rs.getString("DONG").trim() + " ";
               
                if(rs.getString("RI") != null)
                    result2 += rs.getString("RI").trim() + " ";
               
                if(rs.getString("BLDG") != null)
                    result2 += rs.getString("BLDG").trim() + " ";
               
                if(rs.getString("ST_BUNJI") != null)
                    result2 += rs.getString("ST_BUNJI").trim() + " ";
               
                if(rs.getString("ED_BUNJI") != null)
                    result2 += rs.getString("ED_BUNJI").trim() + " ";
               
                dongList.add(result2);
               
                System.out.println("" + (++i) + ": " + result);
            }
           
            // 동 선택
            while(true)
            {
                System.out.print("살고 있는 곳을 선택해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            // 선택한 동 주소
            i = Integer.parseInt(dong);
           
            // 나머지 주소
            while(true)
            {
                System.out.println("나머지 주소를 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            String str = (String)dongList.get(i-1);
            str = str + dong;
           
            System.out.println(str);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}


'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27