2014년 1월 9일 목요일

PreparedStatement에서의 ? 치환하기[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

PreparedStatement에서의 ? 치환하기[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]



지금까지는 ?가 들어가는 쿼리에서 에러가 났을 경우
그 쿼리문장전체를 copy하여 오렌지나 토드같은 툴에 paste한 후
?에 해당하는 파라미터를 일일히 붙여가면서 코딩을 했었습니다.

이런 방법으로 하면 옮기는 과정에서 데이터가 잘못될 경우도 많을 뿐더러
?가 많은 경우 파라미터를 옮기는 것도 여간 노가다 작업이 아니었습니다.

이런 작업을 쉽게 바꿀수 없을까 고민하던중 약간의 발상의 전환을
해보았습니다. 제가 올린 소스에서 ?를 치환하는 부분을 잘 응용한다면
여러 개발환경에서 유용하게 상당히 유용하게 사용될 수 있을 거라 생각됩니다. ^^

///////////  DBManager.java //////////////////

package kkj;

import java.sql.*;
import java.util.Vector;

public class DBManager {
       
        Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
        String query = null;
        String printQuery = null;
        Vector paramVector = null;
               
    public DBManager( String paramQuery ){
               
                query = paramQuery;
                printQuery = paramQuery;
               
                try{
                       
                        // 데이타 베이스 드라이버 설정
                        Class.forName("oracle.jdbc.driver.OracleDriver"); 
               
                        // 데이타 베이스에 접속을 한다.
                    con = DriverManager.getConnection(
                                    "jdbc:oracle:thin:@127.0.0.1:1521:kjwindow", "scott", "tiger");
                   
                    //PreparedStatement object를 생성한다.
                    pstmt = con.prepareStatement( query );
                   
                }catch( Exception e ){
                   
                    System.out.println( "DBManager() Error : " + e.toString() );
                    e.printStackTrace();
                   
            }
               
        }
       
        public void setInt( int seq , int param ){
               
                try{
               
                        // 숫자형 파라미터 설정
                        pstmt.setInt( seq , param );
                        // 출력용 쿼리의 ? 를 치환한다
                        printQuery = printQuery.substring( 0 , printQuery.indexOf( "?" ) ) + Integer.toString( param ) + printQuery.substring( printQuery.indexOf( "?" ) + 1 );
                       
                }catch( Exception e ){
                   
                    System.out.println( "DBManager setInt() Error : " + e.toString() );
                    e.printStackTrace();
                   
            }
               
               
        }
       
        public void setString( int seq , String param ){
               
                try{
                       
                        // 문자형 파라미터 설정
                        pstmt.setString( seq , param );
                        // 출력용 쿼리의 ? 를 치환한다
                        printQuery = printQuery.substring( 0 , printQuery.indexOf( "?" ) ) + "'" + param + "'" + printQuery.substring( printQuery.indexOf( "?" ) + 1 );
                       
                }catch( Exception e ){
                   
                    System.out.println( "DBManager setString() Error : " + e.toString() );
                    e.printStackTrace();
                   
            }
               
        }
       
        public ResultSet executeQuery(){
               
                try{
                       
                        // ResultSet을 얻기위해 SQL query를 실행한다.
                rs = pstmt.executeQuery();
               
                // 로그로 출력하기 위한 치환된 쿼리를 출력
                System.out.println( "query = \n" + printQuery );
                       
                }catch( Exception e ){
                   
                    System.out.println( "DBManager executeQuery() Error : " + e.toString() );
                    e.printStackTrace();
                   
            }

                return rs;
               
        }
       
        public void execute(){
               
                try{
                       
                        // ResultSet을 얻기위해 SQL query를 실행한다.
                pstmt.executeQuery();
               
                // 로그로 출력하기 위한 치환된 쿼리를 출력
                System.out.println( "query = \n" + printQuery );
                       
                }catch( Exception e ){
                   
                    System.out.println( "DBManager execute() Error : " + e.toString() );
                    e.printStackTrace();
                   
            }

        }
       
        public void close(){
               
                // 메모리에 올라간 객체들을 삭제한다.
                if( con != null )
                        con = null;
                if( pstmt != null )
                        pstmt = null;
                if( rs != null )
                        rs = null;
                if( query != null )
                        query = null;
               
        }


}

//////////////// QueryTest.java //////////////////////////////
package client;

import kkj.DBManager;
import java.sql.ResultSet;

public class QueryTest {
       
        public static void main( String args[] ){
               
                String query;
               
               
                // 조회 프로세스
                query =  " SELECT * \n";
                query += "  FROM EMP \n";
                query += "  WHERE EMPNO = ? \n";
                query += "    AND ENAME = ? \n";
                query += "    AND JOB = ? \n";
                                               
                try{
               
                        DBManager DBManager = new DBManager( query );
                        DBManager.setInt( 1 , 7499 );
                        DBManager.setString( 2 , "ALLEN" );
                        DBManager.setString( 3 , "SALESMAN" );
               
                        ResultSet rs = DBManager.executeQuery();
                       
                        while( rs.next() ){
                       
                        System.out.println( "EMPNO : " + rs.getString( "EMPNO" ) );
                        System.out.println( "ENAME : " + rs.getString( "ENAME" ) );
                        System.out.println( "JOB : " + rs.getString( "JOB" ) );
                       
                }
                       
                        DBManager.close();
                       
                }catch( Exception e ){
                   
                    System.out.println( "QueryTest Error : " + e.toString() );
                    e.printStackTrace();
                   
            }
               
                // DML 프로세스
                query =  " INSERT INTO EMP( EMPNO , \n";
                query += "                  ENAME , \n";
                query += "                  JOB ) \n";
                query += "          VALUES( ? ,\n";
                query += "                  ? ,\n";
                query += "                  ? )";
                                                               
                try{
                       
                        DBManager DBManager = new DBManager( query );
                        DBManager.setInt( 1 , 9999 );
                        DBManager.setString( 2 , "김길재" );
                        DBManager.setString( 3 , "개발자" );
                        DBManager.execute();
                       
                        DBManager.close();

                }catch( Exception e ){
                   
                    System.out.println( "QueryTest Error : " + e.toString() );
                    e.printStackTrace();
                   
            }
                       
        }

}




댓글 없음:

댓글 쓰기